0

我正在研究该OpenSCAD语言的 JavaScript 实现,为此目的,它是一种 C 类型的语言。

我已经能够成功解析各种ifif/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

4

0 回答 0