Вопрос

Я пишу 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 и т. Д.).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top