antlr语法中#的目的是什么?

时间:2017-06-01 11:14:09

标签: antlr antlr4

我在ANTLR4语法中有一个声明,如:

expression : DEFAULT    #primitive_expression
           ;

我不知道#在这里是什么意思。

1 个答案:

答案 0 :(得分:3)

他们是替代标签

  

替代标签

     

正如我们在第7.4节“精确事件方法的标签规则替代”中所看到的,我们可以通过使用#运算符标记规则的最外层替代方案来获得更精确的分析树监听器事件。规则中的所有备选方案都必须标记,或者不标记。以下是带有标记替代品的两条规则。

function factorialize(num) { 
 if(num === 0)
   return 1; 
 var arr = []; 
 for(var i=1; i<= num; i++){
   arr.push(i);
 } 
 num = arr.reduce(function(preVal, curVal){
   return preVal * curVal;
 });

  return num;
}

factorialize(5);
     

替代标签不必位于该行的末尾,并且#符号后面不必有空格。 ANTLR为每个标签生成规则上下文类定义。例如,这是ANTLR生成的侦听器:

grammar T;
stat: 'return' e ';' # Return
  | 'break' ';' # Break
  ;
e   : e '*' e # Mult
    | e '+' e # Add
    | INT # Int
    ;

来自:https://github.com/antlr/antlr4/blob/master/doc/parser-rules.md#alternative-labels