VBScript parser grammar: Array assignment modelling

220 views Asked by At

I'm writing a GoldParser VBScript grammar. In my grammar array assignment statements such as id(1) = 2 are not parsed as assignment statements, but as call statements id ((1) = 2) (the = symbol can be both the assignment operator and the comparison operator). How can I change the following grammar to correctly parse array assignment statements?

<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> 

Note: I added the IDDot terminal to parse statements within With correctly, e.g: .obj.sub .obj.par1.

0

There are 0 answers