我是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
请帮帮我。#感恩节前进
发布于 2021-10-22 12:14:01
试试这个:
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"
= [ \t\n\r]*所以上面的代码也支持多个变量,但只能打印一个变量。我在您的示例中编写了语法,所以在赋值变量值时,需要将";“放在末尾,但是打印var时不需要这样做。
发布于 2022-08-01 07:22:46
我从@digital的代码开始,得到了这个(仅在佩吉上测试):
{
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" = [ \t\n\r]*它应该处理多个变量、多个打印语句和与变量交织的打印语句。请注意,{}中的代码块是为解析器的每次运行执行的,因此这些变量不会干扰其他运行。
输入:
a=4;
print a
print b
b=5;
print b
a=6;
print a输出:
[
4,
undefined,
5,
6
]https://stackoverflow.com/questions/69662293
复制相似问题