0

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

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

如您所见,示例中有两个语句,变量声明和 for 循环。有很多不同的表达式,但没有一个表达式也是语句。

现在的问题是这段 JavaScript 代码不会通过解析器:

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

这是因为变量声明不是表达式。

你对如何解决这个问题有什么想法?我可以想到几个方法,但我不想妨碍你自己的想法,所以在此不提。

4

2 回答 2

1

网上有一些例子,在一个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
    )
;
于 2009-05-01T14:51:02.263 回答
0

您应该可以在那里放置任何“简单”语句(即 vardecl、表达式、void 函数调用等)。简单地说,我的意思是任何不是复合语句的东西(即带有额外的花括号,例如 if/else/for/function 等)。

于 2009-05-01T14:46:04.397 回答