解析嵌套的`if / else'声明

时间:2017-12-05 23:28:21

标签: parsing compiler-construction earley-parser nearley

我正在研究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

0 个答案:

没有答案