2010-04-20 6 views
1

현재 코드 블록의 모든 자식이 같은 레벨에있는 AST를 사용하는 컴파일러가 있습니다 (즉, block.children == {stm1, stm2, stm3 , 등 ...}). 이 트리에서 liveness 분석을하려고합니다. 즉, stm1의 처리에서 반환 된 값을 가져 와서 stm2에 전달한 다음 stm2에서 반환 한 값을 가져 와서 stm3에 전달하는 등의 작업을 수행해야합니다. AST가 이런 방식으로 구성되어있을 때 이러한 방식으로 하위 규칙을 실행하는 방법은 없습니다.한 번에 하나의 자식 ANTLR AST 처리하기

주어진 문법 검사 항목으로 하위 문법 항목의 실행을 체인화 할 수있는 방법이 있습니까, 아니면 구문 분석기를 리팩터링하여 중첩 구조를 생성하고 나머지를 업데이트하는 힘든 과정을 거쳐야 할 것입니다. 컴파일러에서 새로운 AST와 함께 작업 할 수 있습니까?


예 ANTLR 문법 조각 :

block 
    : ^(BLOCK statement*) 
    ; 
statement 
    : // stuff 
    ; 

난에 가야하지 않았 으면 무엇 :

block 
    : ^(BLOCK statementList) 
    ; 
statementList 
    : ^(StmLst statement statement+) 
    | ^(StmLst statement) 
    ; 
statement 
    : // stuff 
    ; 

답변

1

파서 (또는 렉서) 매개 변수의 값을 가질 수있는 규칙과 수 값을 반환하십시오. 당신이 파서와 렉서에서 생성 한

grammar Test; 

@members{ 
    public static void main(String[] args) throws Exception { 
     ANTLRStringStream in = new ANTLRStringStream("1;2;3;4;"); 
     TestLexer lexer = new TestLexer(in); 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     TestParser parser = new TestParser(tokens); 
     parser.parse(); 
    } 
} 

parse 
    : block EOF 
    ; 

block 
@init{int temp = 0;} 
    : (i=statement[temp] {temp = $i.ret;} ';')+ 
    ; 

statement [int param] returns [int ret] 
    : Number {$ret = $param + Integer.parseInt($Number.text);} 
    {System.out.printf("param=\%d, Number=\%s, ret=\%d\n", $param, $Number.text, $ret);} 
    ; 

Number 
    : '0'..'9'+ 
    ; 

:

block 
@init {Object o = null; /* initialize the value being passed through */ } 
    : ^(BLOCK (s=statement[o] {$o = $s.returnValue; /*re-assign 'o' */ })*) 
    ; 

statement [Object parameter] returns [Object returnValue] 
    : // do something with 'parameter' and 'returnValue' 
    ; 

여기에 함께 놀러하는 데 사용할 수있는 매우 간단한 예입니다 : 그래서, 당신의 경우에, 당신은 뭔가를 할 수 있습니다 클래스를 컴파일하고 TestParser 클래스를 실행하면 콘솔에 다음과 같은 내용이 출력됩니다.

param=0, Number=1, ret=1 
param=1, Number=2, ret=3 
param=3, Number=3, ret=6 
param=6, Number=4, ret=10 
+0

정말 고마워요. 그게 내가 필요한 것입니다. –

+0

잘 듣고 반갑습니다. 천만에요. –

관련 문제