PEGjs新手求助:如何为自定义解析器添加变量(标识符)声明支持
修正后的PEG.js语法规则及说明
现有语法问题
- 无持久化变量存储作用域,赋值操作仅修改临时变量不会留存
- 规则名大小写不匹配:定义的整数规则为
Integer,赋值语句中调用的是小写integer,无法正常匹配 - 变量匹配正则错误:
a-zA-z会匹配到非字母的特殊字符,需改为a-zA-Z - 未处理语句、关键字、标识符之间的空白字符
- 起始规则直接返回所有行的执行结果数组,无法直接输出print语句的返回值
修正后的完整语法
{ // 初始化全局作用域存储变量 const scope = {} } start = lines:line* { // 返回最后一条非空执行结果,即print语句的输出 return lines.filter(res => res != null).pop() } line = _ left:var _ "=" _ right:Integer _ ";" _ { // 把变量存入全局作用域 scope[left] = right return null } / _ "print" _ middle:var _ { // 从作用域取变量值返回 return scope[middle] } var = [a-zA-Z]+ { return text() } Integer "integer" = [0-9]+ { return parseInt(text(), 10) } _ "whitespace" = [ \t\n\r]*
验证效果
输入你提供的测试代码:
a=4; print a
解析后输出结果为4,符合预期。
内容的提问来源于stack exchange,提问作者Taslima Akhter
相关产品推荐
相关产品推荐

