hour: DIGIT09 | (DIGIT1 DIGIT09) | (DIGIT2 DIGIT04);
month: DIGIT19 | (DIGIT1 DIGIT02);
DIGIT12: '1'..'2';
DIGIT1: '1';
DIGIT2: '2';
DIGIT19: '1'..'9';
DIGIT09: '0'..'9';
DIGIT04: '0'..'4';
DIGIT04: '0'..'2';
我可以在parser中而不是在lexer中定义范围吗?
这种类型的验证最好在侦听器或访问器中执行,这些侦听器或访问器在创建解析树后执行。从一个数字开始:
NUMBER : [0-9]+;
然后根据以下内容定义小时
和月
:
hour : NUMBER;
month : NUMBER;
有了解析树之后,实现enterhour
和entermonth
,以验证其中包含的编号
是否有效。
null null 以下是我的(不完整和不成功的)尝试: 如果不能在lexer中解决这个问题,我可以使用标记、、、、、和自行编写解析器规则。
谢谢回复! 皮特
可能在内部使用的代码将在规则之后被取消,如下所示: ANTLR4就是这样做事的吗?
我刚刚开始学习ANTLR4 lexer规则。我的目标是为Java属性文件创建一个简单的语法。以下是我目前掌握的信息:
从这个例子中,我需要将'some-text'和'more-text'匹配到一个lexer规则中的ANTLR4 lexer规则,并将'->'作为另一个规则。 我使用下面显示的lexer规则作为我的起点,但问题是NAMEDELEMENT规则中允许使用'-'字符,这会导致第一个NAMEDELEMENT匹配变成'some-text-',然后导致边缘规则无法捕获'->'。 我正在寻找一种方法来确保'-'不被