我想创建一个语法来解析文本文件,并根据可配置的"分段器"创建一个关卡树。这是我到目前为止创造的,它有点有用,但是当一个"分段器"出现在文本的开头。例如,文字"和位置"将无法解析。有任何想法吗?
另外,我非常肯定语法可以大大改进,所以欢迎任何建议。
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]+ ;
答案 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)将整个文本加载到内存中并在解析之前将其完全标记化。