JavaScript для цикла в БНФ - PullRequest
0 голосов
/ 01 мая 2009

Я пишу BNF для JavaScript, который будет использоваться для генерации лексера и парсера для языка. Тем не менее, я хотел бы получить некоторые идеи о том, как спроектировать цикл for. Вот упрощенная версия моей нынешней БНФ:

[...]
VarDecl. Statement ::= "var" Identifier "=" Expr ";"
ForLoop. Statement ::= "for" "(" Expr ";" Expr ";" Expr ")"
[...]

Итак, как вы можете видеть, в примере есть два оператора: объявления переменных и циклы for. Существует множество различных выражений, но none выражений также являются операторами.

Проблема в том, что этот код JavaScript не будет проходить через анализатор:

for (var x = 3; [...]; [...])

Это потому, что объявление переменной не является выражением.

Что вы думаете о том, как решить эту проблему? Я могу придумать несколько способов, но я не хочу мешать вашим собственным мыслям, поэтому я не буду упоминать их здесь.

Ответы [ 2 ]

1 голос
/ 01 мая 2009

В сети есть несколько примеров, в грамматике 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
    )
;
0 голосов
/ 01 мая 2009

Вы должны быть в состоянии поместить туда любое «простое» утверждение (например, vardecl, выражение, вызов функции void и т. Д.). Под простым я подразумеваю все, что не является составным оператором (то есть с дополнительными фигурными скобками, такими как if / else / for / function и т. Д.).

...