2013-07-10 9 views
0

루프 잠시 안녕을 위해,ANTLR 문법이

가 나는 동안 루프를 구문 분석을위한 C 문법이 필요합니다. 예를 들어, 다음 코드를 구문 분석해야한다고 가정 해보십시오.

A = 20 
B = 1 
WHILE(A < 30) 
//function call 
A = A + B 
ENDWHILE 

표현식을 구문 분석하고 평가해야합니다. 나는 몇몇 단계를 따라하고 문법을 썼지 만, 그것은 내가 원하는 결과물을 얻지 못하고있다. 위의 코드에 따라 루프 내부의 함수는 조건 검사 후 10 번 호출되어야합니다.

첫째, 나는 (참조 : ANTLR_HASH_TABLE 구조체) 해시 테이블에서 A와 B의 값을 저장하고있어 그동안 규칙은 다음과 같이 보입니다 :

whileStatement : 'WHILE' condExpr 'ENDWHILE' 
       ; 

내가 저장하고 얻을 수 있어요을 값을 해시 테이블에서하지만, 전화를 걸거나 그 많은 번호를 인쇄 할 함수 호출이 붙어 있어요. 그 번호의 함수를 호출/인쇄하려면 어떤 단계를 따라야하는지 알고 싶습니다.

이것이 어떻게 달성되어야하는지에 대한 아이디어는 큰 도움이 될 것입니다.

답변

-1

while 루프의 경우 ANTLR4에서 술어를 사용할 수 있습니다.

게시 한 예제의 경우 while 루프에 대해 다음과 같이 할 수 있습니다 (JAVA 대상 언어).

grammar SO; 

sampleRule 
locals [int A, int B] 
: 
IDENTIFIER1 '=' INTEGER {$A = Integer.parseInt($INTEGER.text);} 
IDENTIFIER2 '=' INTEGER {$B = Integer.parseInt($INTEGER.text);} 
(
{$A < 30;}? 
IDENTIFIER1 '=' IDENTIFIER1 '+' IDENTIFIER2 
{$A = $A + $B;} 
)* 
; 

IDENTIFIER1 
: 'A' 
; 

IDENTIFIER2 
: 'B' 
; 

INTEGER 
: [0-9]* 
; 

이 문법은 제공 한 특정 예제로 제한되지만 위의 문법을 사용하여 확장하기가 너무 어려워서는 안됩니다.

+0

안녕하세요. 위의 문법은 입력 파일에서 이러한 루프를 허용합니다. while 루프는 조건이 실패 할 때까지 구문 분석해야합니다. 즉, while 규칙을 다시 호출해야합니다. 이 작업을 수행하는 방법? 내가 맞으면 재귀 적 파싱 메서드를 구현해야합니까? –