【发布时间】:2015-11-02 20:21:14
【问题描述】:
我使用 EcmaScript 5.1 表达式的语法:
PrimaryExpression :
this
Identifier
Literal
ArrayLiteral
ObjectLiteral
( Expression )
FunctionExpression :
function Identifieropt ( FormalParameterListopt ) { FunctionBody }
MemberExpression :
PrimaryExpression
FunctionExpression
MemberExpression [ Expression ]
MemberExpression . IdentifierName
new MemberExpression Arguments
NewExpression :
MemberExpression
new NewExpression
CallExpression :
MemberExpression Arguments
CallExpression Arguments
CallExpression [ Expression ]
CallExpression . IdentifierName
Arguments :
( )
( ArgumentList )
LeftHandSideExpression :
NewExpression
CallExpression
我用 Wirth 表示法重写它,为它编写递归解析器。 我得到了什么:
PrimaryExpression = this | Identifier | Literal | ObjectLiteral | "(" ExpressionNoIn ")"
Literal = NullLiteral | BooleanLiteral | NumericLiteral | StringLiteral
ObjectLiteral = "{" [PropertyNamesAndValues] "}"
MemberExpression = ( PrimaryExpression | FunctionExpression | new MemberExpression Arguments ) MemberExpression'
MemberExpression' = ( "." Identifier | "[" Expression "]" ) MemberExpression' | e.
NewExpression = ( PrimaryExpression | FunctionExpression ) MemberExpression' | new NewExpression'
NewExpression' = MemberExpression Arguments MemberExpression' | NewExpression
CallExpression = MemberExpression Arguments CallExpression'
CallExpression' = ( Arguments | "[" Expression "]" | "." Identifier ) CallExpression' | e.
Arguments = "(" [ArgumentList] ")"
LeftHandSideExpression = NewExpression | CallExpression
所以,问题是如何在我的新语法中为规则 LeftHandSideExpression 使用左分解。我需要它,因为 First[LeftHandSideExpression] 和 First[CallExpression] 的交集不为空。
谢谢!
【问题讨论】:
标签: javascript parsing recursion compiler-construction grammar