我正在研究该OpenSCAD
语言的 JavaScript 实现,为此目的,它是一种 C 类型的语言。
我已经能够成功解析各种if
和if/else
语句:
if(true) t1=200;t2=500;
if(true) t1=200;
if(true)t1=200;
if(true){t1=200;}
if(true) if(false) {t1=200;}
if(true){t1=200;} else {t2=500;}
但是,我遇到了一个特定的组合,它让我留下了“模棱两可的语法”——Nearley.js
表示解析可能以多种方式发生:
if(true) if(false) {t1=200;} else {echo("hi");}
尝试的解决方案 1:从少数不同的来源制作
selection_statement
-> elseIfStatement {% id %}
bareifStatement
-> "if" _ "(" _ expression _ ")" _ statement {% d => d %}
elseIfStatement
-> bareifStatement _ "else" _ statement {% ifstatement %}
| bareifStatement _ elseIfStatement {% id %}
| bareifStatement
尝试的解决方案 #2 选自https://github.com/vsl-lang/VSL/blob/develop/src/vsl/parser/parser.ne
IfStatement
-> "if" _ "(" _ expression _ ")" _ statement (
_ "else" _ (
statement {% id %}
) {% debug %}
):? {% debug %}
尝试的解决方案3:仍然可以解析两种方式
selection_statement
-> elseIfStatement {% id %}
elseIfStatement
-> "if" _ "(" _ expression _ ")" _ statement (_ "else" _ statement):? {% ifstatement %}
有没有人成功地用 Earley 语法解析过这种语法?
提示?建议?哎呀,我什至会采取解决方案!
(整个包都可以在 github 上找到,但需要进行一些调整才能在其他机器上运行。) https://github.com/JeremyJStarcher/openscadtojs