当前位置: 首页 > 知识库问答 >
问题:

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

龙俊美
2023-03-14

我有以下语法:

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’到lexer规则。

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' | '_')*
    ;

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

共有1个答案

宋嘉禧
2023-03-14

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

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'+
 ;

现在将匹配以下令牌之一:D0FOOD9

这<代码> 解析器规则内部支持已从(至少)v3.3及更高版本中删除。因此,不要使用 内部解析器规则。

 类似资料:
  • 任何编程中的范围都是程序的一个区域,其中定义的变量可以存在,并且超出该变量,无法访问它。 有三个地方可以用C编程语言声明变量 - 在函数或块内部,称为local变量。 在所有函数之外,称为global变量。 在函数参数的定义中称为formal参数。 让我们了解什么是local和global变量,以及formal参数。 局部变量 (Local Variables) 在函数或块内声明的变量称为局部变量

  • 我们在ANTLR中遇到的问题是,我们有这样一个语法: 请记住“鲍勃。”第一行是动态的,可以是任何东西。其中之一就是“鲍勃”。“Bob Offset”行不是动态的,它存在于我们正在解析的每一个类型的文件中。 理想的解决方案是,如果ANTLR有某种方法来指定上下文或解析器规则特定的lexer规则。这样,“Bob offset:”标记在语法中的其他地方就不会出错了。 对此问题的任何想法都将不胜感激。

  • 我正在与JSoup合作,以下是我的代码: 这是页面: 我想得到以下元素的值: itemPrice,_18gRm, itemtitle,_2FRXm 谢谢大家。

  • CloudGate解析规则可以直接导入使用,不需要任何额外的操作,非常方便! 规则列表 规则名称 下载地址 Surge https://async.be/Rule/Basic/Hosts Shadowrocket https://async.be/Rule/Basic/Hosts 解析规则 简要概述:通过实时同步Hosts信息源达到自动更新,同时使用解析模板进行生成。 无需任何其他操作,导入即可使

  • template.defaults.rules art-template 可以自定义模板解析规则,默认配置了原始语法与标准语法。 修改界定符 // 原始语法的界定符规则 template.defaults.rules[0].test = /<%(#?)((?:==|=#|[=-])?)[ \t]*([\w\W]*?)[ \t]*(-?)%>/; // 标准语法的界定符规则 template.def

  • 本文向大家介绍在Python中删除范围内的元素,包括了在Python中删除范围内的元素的使用技巧和注意事项,需要的朋友参考一下 通过使用元素的索引和del函数,可以直接从python删除单个元素。但是在某些情况下,我们需要删除一组索引的元素。本文探讨了仅删除索引列表中指定的列表中那些元素的方法。 使用排序和删除 在这种方法中,我们创建一个包含必须删除的索引值的列表。我们对它们进行排序和反转以保留列