我想实现以下行为:User:class
应该解析为Object - User; Type - class
,Us: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的新手,也许我缺少明显的东西。
答案 0 :(得分:0)
如果您只需要解析简单的内容,则无需使用ANTLR编写解析器。这是我建议仅使用简单正则表达式的极少数情况之一。 如果您想用ANTLR解决它,我会这样做: 1)丑陋的解决方案:您尝试使用谓词或操作来欺骗并强制解析执行所需的操作 2)您只需定义两个标记:一个用于获取标识符,一个用于获取分号。然后,稍后使用解析器在代码中进行合成。
例如,对于User:class
,您将获得[[ID:“ User”],[ID:“ class”]]
而对于Us:er:class
,您将获得[[ID:“ Us”],[ID:“ er”],[ID:“ class”]]
那么您编码后就知道最后一个ID代表类型,所有其他ID的顺序代表对象。
都不是很好的解决方案,但我认为ANTLR不是您要尝试做的正确工具。