ANTLR4:将数字解析为标识符而不是数字文字
ANTLR4: parse number as identifier instead as numeric literal
我有这种情况,必须将整数视为标识符。
底层语言语法(不幸的是)允许这样做。
语法摘录:
grammar Alang;
...
NLITERAL : [0-9]+ ;
...
IDENTIFIER : [a-zA-Z0-9_]+ ;
必须处理的示例代码:
/** declaration block **/
Method 465;
...
在上面的代码示例中,因为 NLITERAL
必须放在 IDENTIFIER
之前,所以解析器选择 465
作为 NLITERAL
。
处理这种情况的好方法是什么?
(理想情况下,避免语法中的应用程序代码,以使其与运行时无关)
我在 SO 上发现了类似的问题,但并不是很有帮助。
没有什么好的方法可以让 465
根据上下文生成 NLITERAL
标记或 IDENTIFIER
标记(您也许可以使用词法分析器模式,但这可能不是非常适合您的需求)。
尽管如此,您可以轻松地做的是在某些地方除了 IDENTIFIERS
之外还允许 NLITERAL
。所以你可以定义一个解析器规则
methodName: IDENTIFIER | NLITERAL;
然后在适当的地方使用该规则代替 IDENTIFIER
。
我有这种情况,必须将整数视为标识符。
底层语言语法(不幸的是)允许这样做。
语法摘录:
grammar Alang;
...
NLITERAL : [0-9]+ ;
...
IDENTIFIER : [a-zA-Z0-9_]+ ;
必须处理的示例代码:
/** declaration block **/
Method 465;
...
在上面的代码示例中,因为 NLITERAL
必须放在 IDENTIFIER
之前,所以解析器选择 465
作为 NLITERAL
。
处理这种情况的好方法是什么?
(理想情况下,避免语法中的应用程序代码,以使其与运行时无关)
我在 SO 上发现了类似的问题,但并不是很有帮助。
没有什么好的方法可以让 465
根据上下文生成 NLITERAL
标记或 IDENTIFIER
标记(您也许可以使用词法分析器模式,但这可能不是非常适合您的需求)。
尽管如此,您可以轻松地做的是在某些地方除了 IDENTIFIERS
之外还允许 NLITERAL
。所以你可以定义一个解析器规则
methodName: IDENTIFIER | NLITERAL;
然后在适当的地方使用该规则代替 IDENTIFIER
。