使用ANTLR 3的C#语法

时间:2013-12-30 04:47:30

标签: c# parsing antlr bnf

我现在正在使用基于this grammar file的Antlr 3编写C#语法。

但是,我发现了一些我无法理解的定义。

NUMBER:
    Decimal_digits INTEGER_TYPE_SUFFIX? ;
// For the rare case where 0.ToString() etc is used.
GooBall
@after        
{
    CommonToken int_literal = new CommonToken(NUMBER, $dil.text);
    CommonToken dot = new CommonToken(DOT, ".");
    CommonToken iden = new CommonToken(IDENTIFIER, $s.text);

    Emit(int_literal); 
    Emit(dot); 
    Emit(iden); 
    Console.Error.WriteLine("\tFound GooBall {0}", $text); 
}
    :
    dil = Decimal_integer_literal d = '.' s=GooBallIdentifier
    ;

fragment GooBallIdentifier
    : IdentifierStart IdentifierPart* ;

以上片段包含'GooBall'的定义。 我对这个定义有一些疑问。

为什么需要GooBall? 为什么这个语法定义lexer规则来解析'0.ToString()'而不是解析器规则?

2 个答案:

答案 0 :(得分:1)

这是因为这是一个有效的表达式,没有被任何其他规则处理 - 我猜你称之为匿名对象,因为缺少一个更好的术语。类似于“你好世界”.ToUpper()。通常,方法调用仅对变量标识符有效或返回值ala GetThing()。Method()或其他方式。

答案 1 :(得分:0)

对不起。我从the official FAQ pages找到了原因。

  

现在,如果你想添加'..'范围运算符,那么1..10才有意义,ANTLR无法区分1.(范围的开始)和1.没有回溯的浮点数。因此,在NUM_FLOAT中匹配“1 ..”并只发出两个非浮动标记: