[英]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.