Pergunta

Eu estou escrevendo BNF para JavaScript que será usado para gerar um lexer e um analisador para a linguagem. No entanto, eu gostaria de algumas idéias sobre como projetar a for-loop. Aqui é a versão simplificada da minha BNF atual:

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

Então, como você pode ver, há duas declarações no exemplo, declarações de variáveis ??e para-loops. Há um monte de diferentes expressões, mas nenhum das expressões também são declarações.

O problema agora é que este código JavaScript não vai passar pelo analisador:

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

Isso ocorre porque uma declaração de variável não é uma expressão.

Quais são as suas ideias sobre como resolver isso? Eu posso pensar de algumas maneiras, mas eu não quero ficar no caminho de seus próprios pensamentos, por isso não vou mencioná-los aqui.

Foi útil?

Solução

Existem alguns exemplos sobre a rede, numa ANTLR ECMAScript gramática você pode encontrar esta estrutura:

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
    )
;

Outras dicas

Você deve ser capaz de colocar qualquer declaração "simples" há (ou seja vardecl, expressão, chamada de função vazio, etc) lá. Por simples que nada significam que não é uma instrução composta (ou seja, por chavetas adicionais, tais como if / else / para / função, etc).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top