ANTLR Parser,需要匹配哪个解析器规则

时间:2011-12-12 20:25:34

标签: antlr

在ANTLR中,对于给定的令牌,有没有办法告诉哪个解析器规则匹配?

例如,来自ANTLR语法:

tokens
{
    ADD='Add';
    SUB='Sub';
}

fragment
ANYDIGIT    :   '0'..'9';

fragment
UCASECHAR   :   'A'..'Z';

fragment
LCASECHAR   :   'a'..'z';

fragment
DATEPART    :   ('0'..'1') (ANYDIGIT) '/' ('0'..'3') (ANYDIGIT) '/' (ANYDIGIT) (ANYDIGIT) (ANYDIGIT) (ANYDIGIT);

fragment
TIMEPART    :   ('0'..'2') (ANYDIGIT) ':' ('0'..'5') (ANYDIGIT) ':' ('0'..'5') (ANYDIGIT);

SPACE       :   ' ';

NEWLINE     :   '\r'? '\n';

TAB         :   '\t';

FORMFEED    :   '\f';

WS          :   (SPACE|NEWLINE|TAB|FORMFEED)+ {$channel=HIDDEN;};

IDENTIFIER  :   (LCASECHAR|UCASECHAR|'_') (LCASECHAR|UCASECHAR|ANYDIGIT|'_')*;

TIME        :   '\'' (TIMEPART) '\'';

DATE        :   '\'' (DATEPART) (' ' (TIMEPART))? '\'';

STRING      :   '\''! (.)* '\''!;

DOUBLE      :   (ANYDIGIT)+ '.' (ANYDIGIT)+;

INT         :   (ANYDIGIT)+;

literal     :   INT|DOUBLE|STRING|DATE|TIME;

var         :   IDENTIFIER;

param       :   literal|fcn_call|var;

fcn_name    :   ADD | 
                SUB | 
                DIVIDE | 
                MOD | 
                DTSECONDSBETWEEN | 
                DTGETCURRENTDATETIME |
                APPEND |
                STRINGTOFLOAT;

fcn_call    :   fcn_name WS? '('! WS? ( param WS? ( ','! WS? param)*)* ')'!;

expr        :   fcn_call WS? EOF;

在Java中:

  CommonTreeNodeStream nodes = new CommonTreeNodeStream(tree);
  nodes.reset();
  Object obj;
  while((obj = nodes.nextElement()) != null)
  {
      if(nodes.isEOF(obj))
      {
          break;
      }
      System.out.println(obj);
  }

因此,在System.out.println(obj),我想知道的是,节点是否与fcn_name规则匹配,或者是否与var规则匹配。

原因是,我试图以与fcn_names不同的方式处理变量。

2 个答案:

答案 0 :(得分:1)

将此内容添加到您的侦听器/访问者:

String[] ruleNames;
public void loadParser(gramParser parser) {  //get parser
    ruleNames = parser.getRuleNames(); //load parser rules from parser
}

从创建侦听器/访问者的任何地方调用loadParser(),例如:

MyParser parser = new MyParser(tokens);
MyListener listener = new MyListener(); 
listener.loadParser(parser);  //so we can access rule names

然后在每个规则中,您可以获得规则的名称,如下所示:

ruleName = ruleNames[ctx.getRuleIndex()];

答案 1 :(得分:0)

不,你不能得到解析器规则的名称(至少,不是没有丑陋的黑客)。

但如果treeCommonTree的实例,则表示您已经调用了解析器的expr规则,这意味着您已经知道expr匹配(它依次匹配fcn_name)。

在相关说明中,请参阅:Get active Antlr rule