Разбор вложенных операторов if/else

Я работаю над реализацией JavaScript OpenSCAD язык, который - для этой цели - язык 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 %}

Кто-нибудь успешно проанализировал этот вид грамматики в синтаксисе Эрли?

Советы? Предложения? Черт возьми, я даже приму решение!

(Весь пакет доступен на github, но для его запуска на других машинах потребуется несколько настроек.) https://github.com/JeremyJStarcher/openscadtojs

0 ответов

Другие вопросы по тегам