我现在正在使用基于 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?
为什么这个语法定义词法规则来解析 '0.ToString()' 而不是解析器规则?

最佳答案

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

关于使用 ANTLR 3 的 C# 语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20833487/

10-10 11:27