我正在编写用于JavaScript的BNF,它将用于为该语言生成词法分析器和解析器。但是,我想了解如何设计for循环的一些想法。这是我当前BNF的简化版本:
[...]
VarDecl. Statement ::= "var" Identifier "=" Expr ";"
ForLoop. Statement ::= "for" "(" Expr ";" Expr ";" Expr ")"
[...]
正如您所看到的,示例中有两个语句,变量声明和for循环。有许多不同的表达式,但表达式的 none 也是语句。
现在的问题是这个JavaScript代码不会通过解析器:
for (var x = 3; [...]; [...])
这是因为变量声明不是表达式。
您对如何解决此问题有何看法?我可以想到几个方面,但我不想妨碍你自己的想法,所以我不会在这里提到它们。
答案 0 :(得分:1)
网上有几个例子,ANTLR ECMAScript grammar 你可以找到这个结构:
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
)
;
答案 1 :(得分:0)
你应该可以在那里放任何“简单”语句(即vardecl,expression,void function call等)。简单来说,我指的是任何不是复合语句的东西(即带有额外的大括号,例如if / else / for / function等)。