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

Antlr lexer匹配非预期规则

戈博易
2023-03-14

我正在重新学习一些基本的Antlr,并尝试编写一个生成todo项的语法:

Meeting at 12pm for 20 minutes

我遇到的问题是,有三个lexer规则特别“不匹配”,这取决于它们使用的上下文:

HOUR: [0-9]|'1'[0-9]|'2'[0-3];
MINUTE: [0-5][0-9];
NONZERO_NUMBER: [1-9][0-9]*;
line 1:20 mismatched input '20' expecting NONZERO_NUMBER
Meeting at 12pm for 120 minutes // Note 120 minutes doesn't match HOUR or MINUTE

以下是我的完整语法以求清晰:

旁白:我知道还有其他奇怪的地方,比如一个事件的名称只能是一个单词,但我是在一次处理一个问题。

grammar Sprint;

event: eventName timePhrase? durationPhrase?;

durationPhrase: 'for' duration;

timePhrase: 'at' time;

duration: (NONZERO_NUMBER MINUTE_STR) | (NONZERO_NUMBER HOUR_STR);

time: ((HOUR ':' MINUTE) | (HOUR)) AMPM?;

eventName: WORD;

MINUTE_STR: 'minute'('s')?;

HOUR_STR: 'hour'('s')?;

HOUR: [0-9]|'1'[0-9]|'2'[0-3];

MINUTE: [0-5][0-9];

NONZERO_NUMBER: [1-9][0-9]*;

AMPM: ('A'|'a'|'P'|'p')('M'|'m');

WORD: ('a'..'z' | 'A'..'Z')+;

WS: (' '|[\n\t\r]) -> skip;

共有1个答案

冷善
2023-03-14

试图在lexer中完成解析器的工作通常是错误的。如果lexer只识别整数,那么解析器就不会有任何问题来解决如何解释数字。您可以在操作或谓词中拒绝8:63这样的时间。

 类似资料:
  • 语法规则 location [=|~|~*|^~] /uri/ { … } 模式 含义 location = /uri = 表示精确匹配,只有完全匹配上才能生效 location ^~ /uri ^~ 开头对URL路径进行前缀匹配,并且在正则之前。 location ~ pattern 开头表示区分大小写的正则匹配 location ~* pattern 开头表示不区分大小写的正则匹配 locat

  • 但我们只对其中一些答案感兴趣。 注意:以上只是展示结构的示例。每个映射都有几十个元素。 我们真正需要的是:https://github.com/pact-foundation/pact-specification/issues/38,但它是计划在V.4中使用的。与此同时,我们正在尝试一种不同的方法。我现在尝试做的是指定列表的每个元素都是一个非空映射。另一种方法是指定列表的每个元素都不为空。这些都可

  • 基本模式匹配 一切从最基本的开始。模式,是正则表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如: ^once 这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once was

  • 我想检查文本字段值是否与我在代码中提到的预期值相同 这是我需要获取值的文本字段 输入类型=“文本”值=“萨达斯”类=“mdl-textfield__input”id=“last_name”名称=“last_name”占位符=“输入姓氏” 下面提到的代码得到了 AssertionError, Assert.assertEquals(driver.findElement(By.xpath(“//inp

  • 它打印出值的等效,这是因为这一行: 通过调用表示。 那么,如何使Hibernate相信是的实例? 我的枚举是由加载的。而由URLClassLoader加载,由另一个类加载器加载。

  • 通过看到我的结果,我有点困惑如何在MatchPherage和match query中进行评分 对于匹配短语,我有如下查询 获得的reults如下 a。“信用-消费者测试文章”得分12.64 b的文件。“信用-X测试文章”得分12.64 c的文件。“Credit-XYZ测试文章”得分10.92 d的文档。“信用测试文章”得分10.22 e的文件。“Credit-Z测试文章”得分09.40的文档 前两