【问题标题】:ANTLR Parser QuestionANTLR 解析器问题
【发布时间】:2011-01-20 17:21:18
【问题描述】:

我正在尝试解析许多文本记录,其中记录中的元素由“+”字符分隔,并且整个记录由“#”字符终止。例如 E1+E2+E3+E4+E5+E6#

单个元素可以是必需的,也可以是可选的。如果一个元素是可选的,那么它的值就会丢失。例如,如果 E2 缺失,则输入字符串将为:E1++E3+E4+E5+E6#。

但是,在处理空的尾随元素时,分隔符 char ('+') 也可能会丢失。例如,如果缺少最后 3 个元素,则字符串可能是:E1+E2+E3#,但也可能是: E1+E2+E3+++#

我在 Antlr 中尝试过以下规则:

'R1''E1 + E2 + E3''+'? “E4”? '+'? “E5”? '+'? “E6”? '#

但是 Antlr 抱怨说它是模棱两可的(E3 后面的每个标记都可能是 E4、E5 或 E6)。输入语法是固定的(它来自旧的大型机系统),所以我想知道是否有人可以解决这个问题?

另一种方法是在规则中指定所有不同的排列,但这将是一项主要任务。

最好的问候和感谢,

迈克尔

【问题讨论】:

  • 您能发布所有您的词法分析器规则吗? (假设不是很多)

标签: antlr grammar


【解决方案1】:

这个任务听起来对 ANTLR 来说太过分了,你有什么理由不使用“+”作为分隔符将字符串拆分成一个数组?

如果它来自大型机,则很可能打算以简单的方式进行处理。

例如,
C++:http://www.cplusplus.com/reference/clibrary/cstring/strtok/
PHP : http://us3.php.net/manual/en/function.explode.php
爪哇:http://java.sun.com/javase/6/docs/api/java/lang/String.html#split%28java.lang.String%29
C#:http://msdn.microsoft.com/en-us/library/system.string.split%28VS.71%29.aspx

只是一个想法。

【讨论】:

  • 鉴于我们不知道他的表达式值 (Es) 是如何解析的,因此正则表达式可能不合适。
  • 嗨沃尔特,它比问题所暗示的更复杂,包括一系列不同的消息、数据结构等,但无论如何谢谢。 Brgds,迈克尔
【解决方案2】:

如果这不明确,可能是因为您的 Es 都具有相同的格式(更复杂的情况是您的 Es 都以相同的 k 字符开头,其中 k 是您的向前看,但我会假设情况并非如此。如果是,这仍然有效;它只需要一个额外的步骤。)

所以看起来您最多可以有 6 个Es 和最多 5 个+s。我们会说“段”是一个可选的E,后跟一个+ - 您可以有5 个段,以及一个可选的尾随E

这个语法大致可以这样表示(ANTLR语法不完善,因为我不是很熟悉):

r : (e_opt? PLUS){1,5} e_opt? END
e_opt : E  // whatever your E is
PLUS : '+'
END : '#'

如果 ANTLR 不支持 {1,5} 之类的内容,则与以下内容相同:

(e_opt? PLUS) ((e_opt? PLUS) ((e_opt? PLUS) ((e_opt? PLUS) (e_opt? PLUS)?)?)?)?

这不是那么干净,所以也许有更好的方法来做到这一点。

【讨论】:

  • {a,b} 不受 ANTLR 支持。
  • 嘿巴特,这是一个很好的提示 - 感谢您的时间,我真的很感激。 Brgds,谢谢,迈克尔
  • 评论应该是“danben” - 谢谢。但你是对的,巴特。 Antlr 的正则表达式支持可能会更好。
猜你喜欢
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 2014-01-18
  • 2010-12-20
  • 1970-01-01
相关资源
最近更新 更多