Antlr 字符串匹配问题(我可以确定优先级吗?)

Antlr 字符串匹配问题(我可以确定优先级吗?),antlr,antlr3,Antlr,Antlr3,我有一个(规定得很糟糕)要求我识别某些关键字,但也有“任何字符串”的规定 例如,在输入“let's have a”中,我必须处理==“beer”、==“curry”和==任何其他内容(理论上,关键字beer&curry优先于所有其他字符串) 当然,当我试图定义它时,我得到 Decision can match input such as "'curry" using multiple alternatives: 2, 3 As a result, alternative(s) 3 were di

我有一个(规定得很糟糕)要求我识别某些关键字,但也有“任何字符串”的规定

例如,在输入“let's have a”中,我必须处理==“beer”、==“curry”和==任何其他内容(理论上,关键字beer&curry优先于所有其他字符串)

当然,当我试图定义它时,我得到

Decision can match input such as "'curry" using multiple alternatives: 2, 3
As a result, alternative(s) 3 were disabled for that input

我想这是一个st00pid n00b常见问题,但没有看到明显的答案。感谢您的帮助……

您需要应用您正在学习的一些语法消歧技术(如果这是家庭作业)。一般来说,您会添加一个额外的规则来消除语法的歧义

您可以做的另一件特定于antlr的事情是在规则中添加一个操作来处理差异。

如果您发布有问题的antlr代码,我可能会提供更多帮助。

您需要应用一些您正在学习的语法消歧技术(如果这是家庭作业)。一般来说,您会添加一个额外的规则来消除语法的歧义

您可以做的另一件特定于antlr的事情是在规则中添加一个操作来处理差异。

如果您发布有问题的antlr代码,我可能会提供更多帮助。

它是否像我声明规则的顺序那样简单?我想知道我们是否可以用一些正则表达式来解决这个问题!:)看起来在“当然,我明白”之后缺少了一些内容。也许是一个坏标签或标志让你疯狂。你能试着修改一下吗?确切地说,我的问题是以下几点(你可以忽略[I]和[G],这两个问题对所有人来说都很常见):1。D> [I][G][;]发起对电话号码的呼叫,对应的字母数字字段为。2.D> mem[I][G][;]在memory mem entry location(可使用Select Phonebook Storage test(选择电话簿存储测试)命令+CPBS=?,查询可用存储器;mem可以是例如ME)中的电话号码。3.D> [I][G][;]拨打入口位置的电话号码。我解决了我的问题。基本上,我想要一条简单的语法规则,里面没有选项。因此,代替规则:a | a p1 | a p1 p2 | b | b p1;我想要规则:a|U规则| b|U规则;a|u规则:a | a p1 | ap1 p2;b|u规则:b|b p1;试图纠正这一错误(与以前的规则匹配的规则),因此我返回到这里显示的第一个示例,它生成ok。显然,作为一个n00b,我还有一点需要学习。它是否像我声明规则的顺序那样简单?我想知道我们是否可以用一些正则表达式来解决这个问题!:)看起来在“当然,我明白”之后缺少了一些内容。也许是一个坏标签或标志让你疯狂。你能试着修改一下吗?确切地说,我的问题是以下几点(你可以忽略[I]和[G],这两个问题对所有人来说都很常见):1。D> [I][G][;]发起对电话号码的呼叫,对应的字母数字字段为。2.D> mem[I][G][;]在memory mem entry location(可使用Select Phonebook Storage test(选择电话簿存储测试)命令+CPBS=?,查询可用存储器;mem可以是例如ME)中的电话号码。3.D> [I][G][;]拨打入口位置的电话号码。我解决了我的问题。基本上,我想要一条简单的语法规则,里面没有选项。因此,代替规则:a | a p1 | a p1 p2 | b | b p1;我想要规则:a|U规则| b|U规则;a|u规则:a | a p1 | ap1 p2;b|u规则:b|b p1;试图纠正这一错误(与以前的规则匹配的规则),因此我返回到这里显示的第一个示例,它生成ok。显然,作为一名n00b,我还有一点需要学习。不,不是作业,我几十年前就放弃了;-)只是一些爱好编程。我试图将其简化为一个非常简单的示例,因此它不是ATD命令的完整规范。ATD是用来拨号的调制解调器命令。它可以是ATD或“ATD>”加上一些从“电话簿”拨号的参数(例如,手机电话簿的SIM卡)。官方定义不明确,但常识表明需要什么。参数可以是1)偏移量。例如,“我的”电话簿(之前已选择SIM卡或手持电话簿)2中的拨号条目5)指示哪个电话簿和偏移量。例如,在我的SIM卡通讯录中拨offset 5(3)给出与某个条目相关的文本,搜索该条目并拨号。例如,拨“比尔·盖茨”。1如果您允许电话簿条目以数字开头,例如“第一国民银行”,则13可能不明确。我不确定如何处理该问题。2和3可能是模棱两可的,但根据常识,电话簿的名称优先于电话簿中的名称。这是我能把它简化为…语法的最简单的方法;选项{language=C;}片段PB|u mem|SM:('SM''SM''SM''SM''SM');碎片PB_mem_HP:('HP'|'HP'|'HP'|'HP');片段PB_mem_类型:(PB_mem_SM | PB_mem_HP);片段小数_位:“0”…'9';片段十进制数:十进制数字+;片段字母数字字符:(十进制数字|'a'..'z'.'a'..'z');片段字母数字字符串:“a'..'z'.'a'..'z'字母数字字符+;片段V250_拨号_位:(十进制_位|'*'|'a'..'c'|'a'..'c')+;电话簿中的AT命令拨号:('AT''AT''AT''AT''AT''AT''AT')('d''d')>;AT命令拨号:('AT'|'AT'|'AT'|'AT'|'AT')('d'|'d');换行符:'\r'?'\n';AT|u cmd:ATD_dial|u电话簿| ATD_dial|u;ATD_拨号:AT_cmd_拨号V250_拨号数字;ATD_dial_from_phone_book:AT_cmd_dial_from_phone_book Decimal_number | AT_cmd_dial_from_phone_book PB_mem_type Decimal_number | AT_cmd_dial_from_phone_book字母数字字符串;很抱歉,格式化很糟糕。。。给出的错误是:[13:09:18]警告(200):at_命令集。g:34:27:决策可以匹配输入,例如“'A'T'{'D',D'}>”'S'm'0'..'9'”,使用多个备选方案:2,3因此,备选方案3被禁用