PEGjs |解析器中实现变量



我是一个非常初学者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
]

最新更新