1

私は GoldParser VBScript 文法を書いています。私の文法配列代入ステートメントでは、 などは代入ステートメントとしてid(1) = 2ではなく、call ステートメントとして解析されます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> 

With注: 内のステートメントを正しく解析するために IDDot ターミナルを追加しました.obj.sub .obj.par1

4

0 に答える 0