我正在为 VBScript 编写 GOLD Parser 语法。这是一个摘录:
<CallStmt> ::= 'Call' <CallExpr>
| <CallExpr> <ParameterList>
!| <CallExpr> '(' <Expr> ')'
| <CallExpr> '(' ')'
<AssignStmt> ::= <CallExpr> '=' <Expr>
| 'Set' <CallExpr> '=' <Expr>
| 'Set' <CallExpr> '=' 'New' <CallExpr>
<CallExpr> ::= '.' <LeftExpr>
| <LeftExpr>
<LeftExpr> ::= ID
| IDDot <LeftExpr>
| ID '(' <ParameterList> ')'
| ID '(' <ParameterList> ').' <LeftExpr>
!VBScript allows to skip parameters a(1,,2)
<ParameterList> ::= <Expr> ',' <ParameterList>
| ',' <ParameterList>
| <Expr>
|
! Value can be reduced from <Expr>
<Value> ::= <ConstExpr>
| <CallExpr>
| '(' <Expr> ')'
我对<CallStmt> ::= <CallExpr> <ParameterList>
规则有冲突。此规则描述了调用不带括号的 sub。例如,以下语句在语法上是正确的:
obj.sub1(1, 2).sub2 1, 2
obj.sub1(1, 2).sub2(1),(2)
Call obj.sub1(1, 2).sub2(1, 2)
如何区分带有括号sub1(1, 2)
的子调用和带有括号的子调用sub2(1),(2)
?