javascript - 我无法实现变量支持
问题描述
我正在尝试对我解析的语言实现“变量声明未来”。
PEG.js 源码:
start
=begin line (pl)+ end
pl
=varx" " left:identifier" "to" "middle:integer line { left=middle;}
/
print"(" middle:identifier ")" line {alert(middle);}
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 Number(parseInt(digits.join(""), 10)); }
我的自定义输入源:
start
set a to 5
print(a)
end
我得到了什么输出:
[
"start",
"
",
[
undefined,
undefined
],
"end"
]
作为警报,我只得到变量名a没有值......
解决方案
试试这个
all
= "start" nl _ ptp:putThenPrint+ _ "end"
{
var all = [];
ptp.forEach(it => {
all.push(it);
});
var r = []
all.forEach(tp => {
tp.toPrint.forEach(p => {
r.push(tp.values[p])
});
});
return "\n" + r.join("\n") + "\n";
}
putThenPrint
= _ mn:multiPutN _ pn:multiPrintN _
{
return {values:mn,toPrint:pn};
}
multiPrintN
= _ mp:printN+ _
{
var r = [];
mp.forEach(it => {
r.push(it);
});
return r;
}
multiPutN
= _ mp:putN+ _
{
var r = {};
mp.forEach(it => {
r[it[0]]=it[1];
});
return r;
}
putN
= _ "set " _ vn:varName _ "to " _ vv:n _ nl+ { return [vn, vv]}
printN
= _ "print(" _ n:varName _ ")" _ nl+ {return n;}
varName
= [a-zA-Z]+ {return text();}
n "integer number"
= _ [0-9]+ { return parseInt(text(), 10); }
nl "new line"
= [\n]
_ "whitespace"
= [ \t]*
此语法不支持“如果”和您在语法中尝试做的其他一些事情,但它会给您一个启动的想法。您需要通过更多示例和预期输出在文本中详细说明您想要的内容
推荐阅读
- angular - 选择侧边栏项目不显示组件
- jupyter - 服务器中的jupyter notebook如何安装unix2dos?
- javascript - 如何让客户端通过 tcp 接收图像?
- android - react native中的react导航,双击时如何让对讲读取选项卡的名称?
- google-apps-script - 如何编写脚本以启用 Google Docs(谷歌应用程序)中的链接?
- python - 列表数组的格式化
- javascript - React-rating-rating-stars-component 值不会改变
- amazon-web-services - 我们是否可以通过某种方式查看现有 QuickSight 报告和仪表板的使用情况统计信息?
- python - 在 Python 中使用队列完成并行函数执行的最佳方法?
- azure - Azure Eventhub 序列号排序