load("grammar.js") // Grammar: // - vars: dicionário de booleanos (pesquisam-se as chaves; isto é, para // testar se uma variável existe, basta testar se g.vars["Var"] é true) // - terms: dicionário de booleanos (same as above) // - init: string // - rules: dicionário de vetores de vetores. cada posição contém um vetor // de todas as regras cujo LHS é a chave. Cada elemento desse vetor é um // vetor contendo a probabilidade da regra seguida dos símbolos do RHS da // regra. // Exemplo: // Gramática: [ VP ] > [ VT ] [ NP ] ;0.9 // [ VP ] > [ Copula ] [ NP ] ;0.1 // Estrutura: g.rules["VP"] = [ [0.9, "VT", "NP"], // [0.1, "Copula", "NP"] ]; // Retorna lista de variáveis que geram o terminal. function prod_term(grammar, symbol){ var ls = []; for (var p in grammar.vars) for (var q in grammar.rules[p]) if (grammar.rules[p][q][1] == symbol) ls.push([p,grammar.rules[p][q]]); return ls; } // Retorna lista de variáveis que geram as duas variáveis de parâmetro // nessa ordem. function prod_vars(grammar, symbol1, symbol2, pos) { var ls=[]; for (var p in grammar.vars) for (var q in grammar.rules[p]) if (grammar.rules[p][q][1] == symbol1) if (grammar.rules[p][q][2] == symbol2) ls.push([p,grammar.rules[p][q],pos]) return ls; } // Algoritmo de Cocke-Younger-Kasami para reconhecimento. function CYK(gram, words) { var V=[]; for (var i=1; i<=words.length; i++) { V[i] = []; for (var j=1; j<=words.length-i+1; j++){ V[i][j] = []; } } for (var r=0; r