ANTLR4模棱两可的语法

时间:2019-02-28 10:13:58

标签: antlr antlr4

我想实现以下行为:User:class应该解析为Object - User; Type - classUs:er:class也应该得到Object - Us:er; Type - class。我无法使第二部分起作用,一旦我将:添加为WORD的合法符号,它就会将整个输入解析为对象Object - Us:er:class。  我的语法:

grammar Sketch;

/*
 * Parser Rules
 */
input               : (object)+ EOF ;
object              : objectName objectType? NEWLINE ;
objectType          : ':' TYPE ;
objectName          : WORD ;

/*
 * Lexer Rules
 */ 
fragment LOWERCASE  : [a-z] ;
fragment UPPERCASE  : [A-Z] ;
fragment NUMBER     : [0-9] ;
fragment WHITESPACE : (' ') ;
fragment SYMBOLS    : [!-/:-@[-`] ;
fragment C          : [cC] ;
fragment L          : [lL] ;
fragment A          : [aA] ;
fragment S          : [sS] ;
fragment T          : [tT] ;
fragment U          : [uU] ;
fragment R          : [rR] ;

TYPE                : ((C L A S S) | (S T R U C T));

NEWLINE             : ('\r'? '\n' | '\r')+ ;

WORD                : (LOWERCASE | UPPERCASE | NUMBER | WHITESPACE | SYMBOLS)+ ;

每个字母的片段用于不区分大小写的解析。 据我了解,词法分析器从上到下优先考虑规则,因此TYPE应该优先于WORD,但我无法实现。 我是antlr4的新手,也许我缺少明显的东西。

1 个答案:

答案 0 :(得分:0)

如果您只需要解析简单的内容,则无需使用ANTLR编写解析器。这是我建议仅使用简单正则表达式的极少数情况之一。 如果您想用ANTLR解决它,我会这样做: 1)丑陋的解决方案:您尝试使用谓词或操作来欺骗并强制解析执行所需的操作 2)您只需定义两个标记:一个用于获取标识符,一个用于获取分号。然后,稍后使用解析器在代码中进行合成。

例如,对于User:class,您将获得[[ID:“ User”],[ID:“ class”]] 而对于Us:er:class,您将获得[[ID:“ Us”],[ID:“ er”],[ID:“ class”]] 那么您编码后就知道最后一个ID代表类型,所有其他ID的顺序代表对象。

都不是很好的解决方案,但我认为ANTLR不是您要尝试做的正确工具。