JavaScript for-loop no BNF
-
03-07-2019 - |
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.
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).