gpt4 book ai didi

antlr - 解析器规则中不能使用范围元素?

转载 作者:行者123 更新时间:2023-12-04 21:46:22 24 4
gpt4 key购买 nike

我有以下语法:

grammar tryout;

tryout : my_cmd
;

my_cmd
: 'start' '0'..'9'+ Name_string
;

Digit
: '0'..'9'
;

Name_string
: ('A'..'Z' | 'a'..'z') ('A'..'Z' | 'a'..'z' | '0'..'9' | '_')*
;

如果我在 ANTLRworks 中看到图表,'0'..'9'+ 显示为空元素,因此 Java 代码编译失败,因为生成的代码具有“if()”语句;如果我在命令行运行,编译也会失败。

解决方法是将 '0'..'9'+ 移动到词法分析器规则。
grammar tryout;

tryout : my_cmd
;

my_cmd
: 'start' Digit+ Name_string
;

Digit
: '0'..'9'
;

Name_string
: ('A'..'Z' | 'a'..'z') ('A'..'Z' | 'a'..'z' | '0'..'9' | '_')*
;

但我想知道这是否是一个错误。为什么不能在解析器规则中使用范围元素?这是在 ANTLR v3.4 上。

最佳答案

内部解析器规则,..不像在词法分析器规则中那样用作字符的范围运算符。另请注意,即使您在解析器规则中定义了文字,ANTLR 也会动态为它们创建词法分析器规则,如下所示:

my_cmd
: 'start' '0'..'9'+ Name_string
;

相当于:
my_cmd
: Start D0..D9+ Name_string
;

Start : 'start';
D0 : '0';
D9 : '9';

如果没记错的话,早期版本的 ANTLR v3 支持解析器规则中的范围运算符,意思是:匹配 D0 之间的任何标记。和 D9 ,但这是/曾经非常脆弱。在 D0 之间添加规则和 D9会改变它的意思:
D0    : '0';
FOO : 'foo';
D9 : '9';

解析器规则:
my_cmd
: '0'..'9'+
;

现在将匹配以下标记之一: D0 , FOOD9 .

..内部解析器规则的支持已从(至少)v3.3 及更高版本中删除。所以,不要使用 ..内部解析器规则。

关于antlr - 解析器规则中不能使用范围元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13779087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com