Estoy tratando de implementar 'futuro de declaración de variable' en mi lenguaje analizado.
Fuente de PEG.js:
start =begin line (pl)+ end pl =varx" " left:identifier" "to" "middle:integer line { left=middle;} / print"(" middle:identifier ")" line {alert(middle);} line ="\n" begin ="start" print ="print" if ="if" equals ="equals" gth ="greater than" identifier =[a-zA-Z]+ {return text();} to ="to" varx ="set" end ="end" integer "integer" = digits:[0-9]+ { return Number(parseInt(digits.join(""), 10)); }Mi fuente de entrada personalizada :
start set a to 5 print(a) endQué salida obtuve:
[ "start", " ", [ undefined, undefined ], "end" ]Y como alerta, solo obtuve el nombre de la variable y no el valor ...
prueba esto
all = "start" nl _ ptp:putThenPrint+ _ "end" { var all = []; ptp.forEach(it => { all.push(it); }); var r = [] all.forEach(tp => { tp.toPrint.forEach(p => { r.push(tp.values[p]) }); }); return "\n" + r.join("\n") + "\n"; } putThenPrint = _ mn:multiPutN _ pn:multiPrintN _ { return {values:mn,toPrint:pn}; } multiPrintN = _ mp:printN+ _ { var r = []; mp.forEach(it => { r.push(it); }); return r; } multiPutN = _ mp:putN+ _ { var r = {}; mp.forEach(it => { r[it[0]]=it[1]; }); return r; } putN = _ "set " _ vn:varName _ "to " _ vv:n _ nl+ { return [vn, vv]} printN = _ "print(" _ n:varName _ ")" _ nl+ {return n;} varName = [a-zA-Z]+ {return text();} n "integer number" = _ [0-9]+ { return parseInt(text(), 10); } nl "new line" = [\n] _ "whitespace" = [ \t]*esta gramática no es compatible con "si" y algunas otras cosas que está tratando de hacer en su gramática, pero le dará una idea inicial. Debe elaborar más de lo que desea en el texto con más ejemplos y resultados esperados