【问题标题】:String matching problem (can I prioritize?)字符串匹配问题(我可以优先考虑吗?)
【发布时间】:2009-12-03 03:38:19
【问题描述】:

我有一个(错误地指定)要求我识别某些关键字,但也有“任何字符串”的规定......

例如,在输入“让我们有一个”中,我必须处理 == "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 常见问题解答,但没有看到明显的答案。感谢您提供任何帮助...

【问题讨论】:

  • 就如我声明规则的顺序一样简单吗?
  • 我想知道我们是否可以用一些正则表达式来解决这个问题! :)
  • “当然,我明白了”之后似乎缺少某些内容。可能是一个坏标签或
  • 准确来说,我的问题出在以下几点(可以忽略[I]和[G],大家都一样): 1. D>[I][G] [;] 发起呼叫到对应的字母数字字段为 的电话号码。 2. D>mem[I][G][;] 发起呼叫到内存mem入口位置中的电话号码(可用内存可以用Select Phonebook Storage测试命令+CPBS=?查询;mem可以是例如我)。 3. D>[I][G][;] 向入口位置的电话号码发起呼叫。
  • 我解决了我的问题。基本上,我想要一个主要的简单语法规则,其中没有选项。所以,而不是
     规则:一个 p1 |一个 p1 p2 |乙 | b p1; 
    我想要
     规则:a_rule | b_rule; a_rule: 一个 |一个 p1 | ap1 p2; b_rule : b | b p1; 
    尝试这样做给了我错误(规则与之前的规则匹配),所以我恢复到这里显示的第一个示例并且它生成正常。显然,作为一个n00b,我还有一点要学。

标签: antlr antlr3


【解决方案1】:

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

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

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

【讨论】:

  • 不,不是家庭作业,几十年前我放弃了它;-) 只是一些爱好编程。我试图将其简化为一个非常简单的示例,因此它不是 ATD 命令的完整规范。 ATD 是调制解调器拨号命令。可以是 ATD 或 "ATD>" 加上一些从 'phone book 拨号的参数(例如手机电话本的 SIM 卡。官方定义 有歧义,但常识表明想要什么。
  • 参数可以是 1) 偏移量。例如,拨打我的电话簿中的条目 5(之前已选择 SIM 或手机电话簿) 2)指示哪个电话簿和偏移量。例如。在我的 SIM 卡电话簿中拨打偏移量 5 3) 给出与条目关联的文本,搜索并拨打它。例如,拨打“比尔·盖茨”。如果您允许电话簿条目以数字开头,例如“第一国家银行”,则 1 3 可能会模棱两可。我不确定如何处理。 2 和 3 可能有歧义,但常识说电话簿的名称优先于电话簿中的名称。这是我可以将其简化为最简单的...
  • 语法 at_command_set;选项{语言=C;片段 PB_mem_SM : ('sm' | 'Sm' | 'sM' | 'SM');片段 PB_mem_HP : ('hp' | 'Hp' | 'hP' | 'HP');片段 PB_mem_type : (PB_mem_SM | PB_mem_HP);片段 Decimal_digit : '0'..'9' ;片段 Decimal_number : Decimal_digit+;片段 Alpha_numeric_char : (Decimal_digit | 'a'..'z'|'A'..'Z') ;片段 Alpha_numeric_string : 'a'..'z'|'A'..'Z' Alpha_numeric_char+;片段 V250_dialing_digits : (Decimal_digit | '*' | 'a'..'c' | 'A' .. 'C')+; AT_cmd_dial_from_phone_book: ('AT' | 'at' | 'aT' | 'At') ('d'|'D')'>';
  • AT_cmd_dial : ('AT' | 'at' | 'aT' | 'At') ('d'|'D') ; NEWLINE : '\r'?'\n'; AT_cmd : ATD_dial_from_phone_book | ATD_拨号; ATD_dial : AT_cmd_dial V250_dialing_digits ; 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 Alpha_numeric_string ;
  • 对不起,格式很糟糕......给出的错误是:[13:09:18] 警告(200):at_command_set.g:34:27:决策可以匹配输入,例如“' A''T'{'D', 'd'}'>''S''m''0'..'9'" 使用多个备选方案:2, 3 结果,备选方案 3 被禁用对于该输入 [13:09:18] 错误(208):at_command_set.g:34:1:永远无法匹配以下令牌定义,因为先前的令牌匹配相同的输入:ATD_dial,ATD_dial_from_phone_book
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 2017-11-01
  • 2014-07-21
  • 1970-01-01
相关资源
最近更新 更多