我是一个非常初学者PEGjs我需要帮助实现变量(标识符)声明支持我的解析器。
输入代码如下:
a=4;
print a
我的PEGjs语法:
start
=(line)*
line
=left:var"="right:integer";" {left=right;}
/
print middle:var {return middle;}
print
="print"
var
=(a-zA-z)+
Integer "integer"
= _ [0-9]+ { return parseInt(text(), 10); }
预期输出:4
请帮帮我。# ThanksInAdvance
try this:
all
= _ mn:multiPutN _ pn:printN _
{
return mn[pn];
}
multiPutN
= mp:putN+ _
{
var r = {};
mp.forEach(it => {
r[it[0]]=it[1];
});
return r;
}
putN
= vn:varName _ "=" _ nn:n _ ";" { return [vn, nn]}
printN
= print _ n:varName _ {return n;}
varName
= [a-zA-Z]+ {return text();}
print
="print"
n "integer number"
= _ [0-9]+ { return parseInt(text(), 10); }
_ "whitespace or new line"
= [ tnr]*
使上面的代码也支持多变量,但只能打印一个变量。我在你的例子中写了语法,所以当分配变量值时,你需要输入";但是print var不需要用
我从@digital-alpha的代码开始,得到了这个(只在Peggy上测试过):
{
const vars = {};
const result = [];
}
lines = (line _)* { return result; }
line
= set
/ print
set = v:varName _ "=" _ num:n _ ";" { vars[v] = num; }
print = "print" _ v:varName { result.push(vars[v]); }
varName = $[a-zA-Z]+
n "integer number" = num:$[0-9]+ { return parseInt(num, 10); }
_ "whitespace or new line" = [ tnr]*
应该处理多个变量、多个打印语句以及与变量交错的打印语句。请注意,{}
中的代码块是在每次解析器运行时执行的,因此这些变量不会干扰其他运行。
输入:
a=4;
print a
print b
b=5;
print b
a=6;
print a
输出:
[
4,
undefined,
5,
6
]