首页 > 解决方案 > 我无法实现变量支持

问题描述

我正在尝试对我解析的语言实现“变量声明未来”。

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没有值......

标签: javascriptparsingpegjs

解决方案


试试这个

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]*

此语法不支持“如果”和您在语法中尝试做的其他一些事情,但它会给您一个启动的想法。您需要通过更多示例和预期输出在文本中详细说明您想要的内容


推荐阅读