我试图使用ANTLR4创建一个简单的解析器,但我在识别lexer令牌方面遇到了问题。问题是,即使单词SAYS后面有一个“:”,解析器规则也不能识别它。而且对于提及,@Michael也没有被识别出来。
输入的文本是:john说:hello@Michael这将不起作用
//LEXER规则
grammar ChatLexer;
/*
* Lexer Rules
*/
fragment A : ('A'|'a') ;
fragment S : ('S'|'s') ;
fragment Y : ('Y'|'y') ;
fragment H : ('H'|'h') ;
fragment O : ('O'|'o') ;
fragment U : ('U'|'u') ;
fragment T : ('T'|'t') ;
fragment LOWERCASE : [a-z] ;
fragment UPPERCASE : [A-Z] ;
SAYS : S A Y S ;
SHOUTS : S H O U T S;
WORD : (LOWERCASE | UPPERCASE | '_')+ ;
WHITESPACE : (' ' | '\t') ;
NEWLINE : ('\r'? '\n' | '\r')+ ;
TEXT : ('['|'(') ~[\])]+ (']'|')') ;
fragment COLON : ':';
fragment DASH : '-';
fragment LEFTBRACKET : '(';
fragment RIGHTBRACKET : ')';
fragment LEFTSQRBRACKET : '[';
fragment RIGHTSQRBRACKET: ']';
fragment AT : '@';
fragment SLASH : '/';
parser grammar ChatParser;
/*
* Parser Rules
*/
chat : line+ EOF ;
line : name command message NEWLINE;
message : (emoticon | link | color | mention | WORD | WHITESPACE)+ ;
name : WORD WHITESPACE;
command : (SAYS | SHOUTS) COLON WHITESPACE ;
emoticon : COLON DASH? RIGHTBRACKET
| COLON DASH? LEFTBRACKET
;
link : TEXT TEXT ;
color : SLASH WORD SLASH message SLASH;
mention : AT WORD ;
片段
只能由其他lexer规则使用,而不能在解析器规则中使用。从colon
和at
规则中删除fragment
关键字。
一些背景资料W.R.T.lexer和解析器:
我需要antlr4来解析一些简单的HTML文件。我已经将语法分为解析器语法和lexer语法,这样我就可以对标记内部的东西( )使用孤岛语法,如“确定的ANTLR4引用”中所述。antlr4反复告诉我“令牌识别错误”。 解析器语法: 示例HTML文件: ANTLR4的输出:
是否有方法为模式中捕获的所有字符返回一个字符串类型的标记,包括导致进入模式的字符? 模式何时结束? 我知道我也可以像这样编写字符串标记:
我正在尝试创建一个语法来解析Solr查询(只需要稍微相关,您不需要了解任何关于Solr的信息来回答这个问题--只需要比我了解更多关于ANTLR4.7的信息就可以了)。我将它建立在Solr6中的QueryParser.jj文件的基础上。我找了一个现存的,但似乎没有一个不是旧的和过时的。 我被困住了,因为当我尝试运行解析器时,我得到了“token recognition error”。 我创建的lex
看起来lexer操作中的getText()无法检索正确匹配的令牌。这是正常的行为吗?例如,我的部分语法有以下规则用于解析C++样式的标识符,这些规则支持\u序列将unicode字符嵌入到标识符名称中: 使用包含带有不正确unicode转义序列的标识符的1行输入进行测试: 但是,IDENTIFIER lexer规则操作的getText()会产生以下错误结果: 为什么lexer规则的getText()
如何实现这些模式?
我试图将一个lexer语法导入到另一个lexer语法中。导入的语法使用不同的模式(在XMLLexer示例中,mode INSIDE和PROC_INSTR)。 如果我将导入的部分内联到主lexer定义中,解析器就可以工作,但我希望使用导入功能来进行干净的分离。(不是针对XML/HTML示例,而是在另一种情况下。) 是否有可能让它工作使用进口或这是一个ANTLR4的限制?