PEG.js实现自定义解析语言变量支持时出现赋值与打印异常
问题排查与解决方法
核心问题根因
- 缺少持久化的变量存储上下文:你在set分支的动作块中给
left=middle赋值,仅作用于当前动作块的局部作用域,赋值完成后变量就被销毁,没有真正存储变量映射关系。 - 规则动作块无返回值:
pl规则的两个分支动作块都没有返回值,所以最终解析结果中对应pl的位置全部是undefined。 - print分支取值错误:你直接alert的
middle是identifier规则返回的变量名字符串,不是变量对应的存储值。 - 空格匹配鲁棒性差:规则中硬编码单个空格
" "匹配分隔符,若存在多空格、制表符等情况会直接匹配失败。
修复后的完整PEG.js代码
{{ // 初始化全局变量存储上下文 const variables = {} }} start = begin line (pl)+ end pl = varx whitespace left:identifier whitespace to whitespace middle:integer line { variables[left] = middle; return { type: 'set', name: left, value: middle }; } / print "(" middle:identifier ")" line { const val = variables[middle]; alert(val); return { type: 'print', name: middle, value: val }; } whitespace = [ \t]+ 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 parseInt(digits.join(""), 10); }
验证结果
使用你提供的输入源测试:
start set a to 5 print(a) end
- alert弹窗会正确弹出数值
5 - 解析返回结果中不会再出现undefined,会返回每个pl操作的结构化信息。
内容的提问来源于stack exchange,提问作者Taslima Akhter
相关产品推荐
相关产品推荐

