当前位置: 首页 > 知识库问答 >
问题:

使用antlr4时不标识Lexer令牌

别宏盛
2023-03-14

我试图使用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 ;

共有1个答案

彭允晨
2023-03-14

片段只能由其他lexer规则使用,而不能在解析器规则中使用。从colonat规则中删除fragment关键字。

一些背景资料W.R.T.lexer和解析器:

  • Antlr中解析器规则和lexer规则之间的实际区别?
  • lexer vs解析器
 类似资料:
  • 我需要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的限制?