我正在编写用于JavaScript的BNF,它将用于为该语言生成词法分析器和解析器。但是,我想了解如何设计for循环的一些想法。这是我当前BNF的简化版本:

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

正如您所看到的,示例中有两个语句,变量声明和for循环。有许多不同的表达式,但表达式的 none 也是语句。

现在的问题是这个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