繁体   English   中英

使用ANTLR 3的C#语法

[英]C# grammar using ANTLR 3

我现在正在使用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()'而不是解析器规则?

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

抱歉。 我从官方常见问题页面找到了原因。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM