Разбор вложенных операторов 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