记录逗号分隔的标识符列表的类型?

时间:2013-12-17 05:29:24

标签: semantics javacc

对于语义分析,我需要将标识符及其类型放入自定义哈希映射中。但鉴于以下语法规则和实现,我无法记录下面的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 个答案:

答案 0 :(得分: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) ; } }
}