2017-09-20 12 views
1

を取るなぜ私がこの持っている:先読みは何をするのか、そしてそれは2つのトークン

void Identifier() : { Token t;} 
{ 
t = <IDENTIFIER> {jjtThis.setValue(t.image);} 
} 

void AssignStatement() : { Token t;} 
{ 
(
    LOOKAHEAD(2) Identifier() t = <ASSIGN> 
    { 
     jjtThis.addOp(t.image); 
    } 
)+ Expression() 
} 

式は、()の比較を呼び出し、比較は()(オペレーターと命じた... logicExpression()などを呼び出します優先度) 私のトークンは代入演算子、算術演算子、論理演算子、比較、セミコロン、if、for、for文など... LOOKAHEAD(2)は、次の2つのトークンを調べて、私の場合、私はそれを理解していません。

答えて

1

パーズを選択する必要があるときは、通常、入力の次のトークンに基づいて行います。この場合、ループに留まるか、ループを離れるかを選択する必要があります。しかし、通常のトークンは、次のトークンが<IDENTIFIER>であれば、Identifierの開始またはExpressionの開始である可能性があるので、通常のトークンでは不十分です。しかし、先読みのトークンは2トークンで十分です。次の2つのトークンは<IDENTIFIER> <ASSIGN>です。これは、式が開始されないためループ内にとどまるはずです。そして表現はちょうど<IDENTIFIER>であり、<ASSIGN>AssignStatementに従うことができません。

I.e. AssignStatementの生成コードは、ツリー構築コードを無視して、このようになります。

call Identifier 
if the next token is not an <ASSIGN> error 
read the next token, call it t 
while the next two tokens are <IDENTIFIER> <ASSIGN> 
    call Identifier 
    if the next token is not an <ASSIGN> error 
    read the next token, call it t 
call Expression 
関連する問題