JavaScript для цикла в БНФ
-
03-07-2019 - |
Вопрос
Я пишу BNF для JavaScript, который будет использоваться для генерации лексера и парсера для языка. Тем не менее, я хотел бы получить некоторые идеи о том, как спроектировать цикл for. Вот упрощенная версия моей нынешней БНФ:
[...]
VarDecl. Statement ::= "var" Identifier "=" Expr ";"
ForLoop. Statement ::= "for" "(" Expr ";" Expr ";" Expr ")"
[...]
Итак, как вы можете видеть, в примере есть два оператора: объявления переменных и циклы for. Существует множество различных выражений, но нет выражений также являются операторами.
Теперь проблема в том, что этот код JavaScript не пройдет через синтаксический анализатор:
for (var x = 3; [...]; [...])
Это потому, что объявление переменной не является выражением.
Что вы думаете о том, как решить эту проблему? Я могу придумать несколько способов, но я не хочу мешать вашим собственным мыслям, поэтому я не буду упоминать их здесь.
Решение
В сети есть несколько примеров в грамматике ANTLR ECMAScript Вы можете найти эту структуру:
iterationStatement:
'do' statement 'while' LPAREN expression RPAREN SEMI
| 'while' LPAREN expression RPAREN statement
| 'for' LPAREN (
(expressionNoln)? SEMI (expression)? SEMI (expression)? RPAREN statement
| 'var' variableDeclarationListNoln SEMI (expression)? SEMI (expression)? RPAREN statement
| leftHandSideExpression 'in' expression RPAREN statement
| 'var' variableDeclarationNoln 'in' expression RPAREN statement
)
;
Другие советы
Вы должны иметь возможность указать любое "простое" значение. оператор там (т.е. vardecl, выражение, вызов функции void и т. д.) там. Под простым я подразумеваю все, что не является составным оператором (то есть с дополнительными фигурными скобками, такими как if / else / for / function и т. Д.).