2013-12-17 2 views
0

의미 분석을 위해 식별자와 그 유형을 사용자 정의 해시 맵에 넣어야합니다. 그러나 다음과 같은 문법 규칙과 구현을 감안할 때, 아래 ident_list에 의해 선언 된 모든 식별자를 어떻게 기록 할 수 있을지는 모르겠습니다.쉼표로 구분 된 식별자 목록 유형을 기록하십시오.

문법 규칙 :

var_decl := var ident_list:type (, ident_list:type)* ; 
ident_list := identifier (, identifier)* 
type := integer | boolean | real | string | void 

이 다음에 jjt 파일에서 구현 될 때 :

void var_decl() #void : {Token t; String[] name;} 
{ 
    <VAR> ident_list() <COLON> type() #var_decl(2) 
    (<COMMA> ident_list() <COLON> type() #var_decl_ext(2))* <SEMIC> 
} 


void ident_list() : {} 
{ 
    identifier() (<COMMA> identifier())* 
} 


String identifier() #ID : { Token t; } 
{ 
    t=<ID> { jjtThis.value = t.image; return t.image; } 
} 


String type() #TYPE : { Token t; } 
{ 
    t=<INTEGER> {jjtThis.value = t.image; return t.image; } | 
    t=<BOOLEAN> {jjtThis.value = t.image; return t.image; } | 
    t=<REAL> {jjtThis.value = t.image; return t.image; } | 
    t=<STRING> {jjtThis.value = t.image; return t.image; } | 
    t=<VOID> {jjtThis.value = t.image; return t.image; } 
} 

그것이 내가 필요한 정보를 얻는 방법을 볼 수있는 각 var_decl에서 단지 유일한 식별자 인 경우 하지만 할당을 위해 var_decl에 하나 이상의 식별자 목록을 전달하는 방법은 무엇입니까? 이것은 jjtree/javacc에서 현실적으로 달성 할 수 있습니까?

답변

1

예. 다음과 같이 ident_list에서 식별자 목록을 반환 할 수 있습니다.

List<String> ident_list() : { 
    List<String> ids = new ArrayList<String>() ; 
    String id ; } 
{ 
    id = identifier() { ids.add(id) ; } 
    (<COMMA> id = identifier() { ids.add(id) ; })* 
    {return ids ; } 
} 

이제 리펙터 var_decl 조금. 지도로하는 일은 당신에게 달려 있지만 노드에 숨겨 놓을 것입니다.

void var_decl() #var_decl : { 
    HashMap<String, String> decls = new HashMap<String, String>() ; 
} 
{ 
    <VAR> one_var_decl(decls) 
    (<COMMA> one_var_decl(decls))* <SEMIC> 
    { jjThis.decls = decls ; } 
} 

지도를 새로운 비 터미널로 빌드하십시오.

void one_var_decl(HashMap<String, String> decls) #void : 
{ 
    List<String> ids ; 
    String ty ; 
} 
{ 
    ids = ident_list() <COLON> ty = type() 
    { for(String id <- ids) { 
      // You may want to emit an error or warning here if there is a duplication. 
      decls.add(id, ty) ; } } 
} 
+0

감사합니다. 지금까지 온라인에서 찾은 것보다 더 눈을 떴습니다. – Gybe