我有以下语法:
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上。
在解析器规则中,...
不能像在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'+
;
现在将匹配以下令牌之一:D0
、FOO
或D9
。
这<代码>
解析器规则内部支持已从(至少)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删除单个元素。但是在某些情况下,我们需要删除一组索引的元素。本文探讨了仅删除索引列表中指定的列表中那些元素的方法。 使用排序和删除 在这种方法中,我们创建一个包含必须删除的索引值的列表。我们对它们进行排序和反转以保留列