1

我正在编写 GoldParser VBScript 语法。在我的语法数组赋值语句中,例如id(1) = 2不被解析为赋值语句,而是作为调用语句id ((1) = 2)(= 符号可以是赋值运算符和比较运算符)。如何更改以下语法以正确解析数组赋值语句?

<CallStmt>    ::= 'Call' <CallExpr>
               |  '.' <CallPath>
               |  <CallPath>

<AssignStmt>  ::= <CallExpr> '=' <Expr>
               |  'Set' <CallExpr> '=' <Expr>
               |  'Set' <CallExpr> '=' 'New' <CtorPath>

<CtorPath>    ::= IDDot <CtorPath>
               |  <Member>

<CallPath>    ::= <MemberDot> <CallPath>
               |  ID '(' ')'
               |  ID  <ParameterList>

<CallExpr>    ::= '.' <MemberPath>
               |  <MemberPath>

<MemberPath>  ::= <MemberDot> <MemberPath>
               |  <Member>

<Member>      ::= ID
               |  ID '(' <ParameterList> ')'

<MemberDot>   ::= IDDot
               |  ID '(' <ParameterList> ').'

!VBScript allows to skip parameters a(1,,2)
<ParameterList> ::= <Expr> ',' <ParameterList>
                 |  ',' <ParameterList>
                 |  <Expr>
                 |  

! Value can be reduced from <Expr>                       
<Value>       ::= NumberLiteral
               | StringLiteral
               | <CallExpr>
               | '(' <Expr> ')'

!--- The rest of the grammar ---               
"Start Symbol"  = <Start>

{WS}            = {Whitespace} - {CR} - {LF}
{ID Head}       = {Letter} + [_]
{ID Tail}       = {Alphanumeric} + [_]
{String Chars}  = {Printable} + {HT} - ["]

Whitespace      = {WS}+
NewLine         = {CR}{LF} | {CR} | {LF}

ID              = {ID Head}{ID Tail}*
IDDot           = {ID Head}{ID Tail}* '.'
StringLiteral   = ('"' {String Chars}* '"')+
NumberLiteral   = {Number}+ ('.' {Number}+ )?

<nl>          ::= NewLine <nl>          !One or more
               |  NewLine

<nl Opt>      ::= NewLine <nl Opt>      !Zero or more
               |  !Empty

<Start>       ::= <nl opt> <StmtList>

<StmtList>    ::= <CallStmt> <nl> <StmtList>
               |  <AssignStmt> <nl> <StmtList>
               |

<Expr>        ::= <Compare Exp> 

<Compare Exp> ::= <Compare Exp> '=' <Add Exp>
               |  <Add Exp>

<Add Exp>     ::= <Add Exp> '+' <Mult Exp>
               |  <Add Exp> '-' <Mult Exp>
               |  <Mult Exp> 

<Mult Exp>    ::= <Mult Exp> '*' <Negate Exp> 
               |  <Mult Exp> '/' <Negate Exp> 
               |  <Negate Exp> 

<Negate Exp>  ::= '-' <Value> 
               |  <Value> 

注意:我添加了 IDDot 终端以With正确解析语句,例如:.obj.sub .obj.par1.

4

0 回答 0