用于多级文本分割的ANTLR语法

时间:2016-02-04 10:59:38

标签: parsing antlr antlr4

我想创建一个语法来解析文本文件,并根据可配置的"分段器"创建一个关卡树。这是我到目前为止创造的,它有点有用,但是当一个"分段器"出现在文本的开头。例如,文字"和位置"将无法解析。有任何想法吗?

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

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]+ ;

2 个答案:

答案 0 :(得分:1)

我绝对会使用Scala解析器组合库。

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

这些只是图书馆的两个例子,你可以手工编写,只需很少的努力,并调整到你需要的任何东西。我应该提一下,如果您自己编写解析器monad,则应该使用Scalaz(https://github.com/scalaz/scalaz)。

答案 1 :(得分:0)

我根本不会使用解析器完成该任务。您只需要关键字定位。

如果您只是扫描文本中的"分割器"它会更容易,也更灵活。通过走过输入。这也允许处理任何大小的文本(例如,通过使用内存映射文件),而解析器通常(肯定是ANTLR)将整个文本加载到内存中并在解析之前将其完全标记化。