【问题标题】:ANTLR grammar for multi-level text segmentation用于多级文本分割的 ANTLR 语法
【发布时间】:2016-02-04 10:59:37
【问题描述】:

我想创建一个语法,它将解析一个文本文件并根据可配置的“分段器”创建一个级别树。这是我到目前为止创建的,它有点工作,但是当“segmentor”出现在文本的开头时会停止。例如,文本“和位置”将无法解析。有任何想法吗?

另外,我很确定语法可以大大改进,所以欢迎任何建议。

grammar DocSegmentor;

@header {
package segmentor.antlr;
}

// PARSER RULES
levelOne: (levelTwo LEVEL1_SEG*)+ ;

levelTwo: (levelThree+ LEVEL2_SEG?)+ ;
levelThree: (levelFour+ LEVEL3_SEG?)+ ;
levelFour: (levelFive+ LEVEL4_SEG?)+ ;
levelFive: tokens;

tokens: (DELIM | PAREN | TEXT | WS)+ ;


// LEXER RULES
LEVEL1_SEG  : '\r'? '\n'| EOF ;
LEVEL2_SEG  : '.' ;
LEVEL3_SEG  : ',' ;
LEVEL4_SEG  : 'and' | 'or' ;

DELIM   :  '`' | '"' | ';' | '/' | ':' | '’' | '‘' | '=' | '?' | '-' | '_';
PAREN   :  '(' | ')' | '[' | ']' | '{' | '}' ;

TEXT    : (('a'..'z') | ('A'..'Z') | ('0'..'9'))+ ;
WS      : [ \t]+ ;

【问题讨论】:

  • 这些分段器是否需要在运行时进行配置?如果是,我会使用解析器组合器,因为这些库非常灵活。
  • 是的,我认为这将非常有用。你对 Java/Scala 有什么建议吗?

标签: parsing antlr antlr4


【解决方案1】:

我肯定会使用 Scala 解析器组合库。

https://lihaoyi.github.io/fastparse/ https://github.com/scala/scala-parser-combinators

这些只是库的两个示例,您可以轻松地手动编写并调整到您需要的任何内容。我应该提一下,如果您自己编写解析器 monad,您应该使用 Scalaz (https://github.com/scalaz/scalaz)。

【讨论】:

  • 感谢您的回答。我一定会调查的。不过,ANTLR 的问题仍然存在。
  • @spyk 是的,当然。这只是您正在尝试的替代方案。 :)
【解决方案2】:

我根本不会使用解析器来完成这项任务。您所需要的只是关键字定位。

如果您只是通过输入来扫描文本以查找“分段器”,这会更容易、更灵活。这也允许处理任何大小的文本(例如,通过使用内存映射文件),而解析器通常(当然是 ANTLR)将整个文本加载到内存中并在解析之前对其进行完全标记。

【讨论】:

  • 这是一个公平的观点,这是我迄今为止使用的非常成功的方法。然而,我希望能够支持更复杂的结构,例如嵌套括号和其他语言结构,但是手动代码的复杂性导致事情失控,这就是我一直在寻求转向解析器的原因。
猜你喜欢
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 2015-06-01
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
相关资源
最近更新 更多