2017-09-20 16 views
1

소요 왜이있다 : 비교하고 비교를() 등 logicExpression()를 호출 호출)할, 그리고 두 개의 토큰

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

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

식 ((운영자와 함께 주문 우선 순위) 내 토큰은 할당 연산자, 산술 및 논리 연산자, 비교, 세미콜론, if, while, for 문 등 ... LOOKAHEAD (2)는 다음 두 개의 토큰을보고 어떤 규칙을 선택할지 결정합니다. 하지만 제 경우에는 그것을 이해하지 못합니다.

답변

1

구문 분석을 선택해야 할 때 일반적으로 입력의 다음 토큰을 기준으로 구문 분석을 수행합니다. 이 경우에는 루프에 머 무르거나 루프를 벗어나는 선택을해야합니다. 그러나 다음 토큰이 <IDENTIFIER>이면 Identifier 또는 시작 부분이 Expression 일 수 있기 때문에 일반적인 하나의 토큰으로는 충분하지 않습니다. 그러나 앞으로 2 토큰이면 충분합니다. 다음 두 토큰은 <IDENTIFIER> <ASSIGN>입니다. 루프는 표현식의 시작이 될 수 없기 때문에 루프에 있어야합니다. 그리고 표현식이 <IDENTIFIER> 일 때 <ASSIGN>AssignStatement을 따라갈 수 없습니다.

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