使用 antlr4 时未识别 Lexer 标记

Lexer tokens are not identified when using antlr4

我正在尝试使用 ANTLR4 创建一个简单的解析器,但我在识别词法分析器标记时遇到了问题。问题是即使在单词 SAYS 之后有一个“:”,它也没有被解析器规则识别。还有对于 MENIONS,@michael 也未被识别。

输入文本是:john SAYS:你好@michael 这行不通

//词法分析器规则

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 ;

我不明白为什么“:”和“@”无法识别

A fragment 只能由其他词法分析器规则使用,永远不能在解析器规则中使用。从 COLONAT 规则中删除 fragment 关键字。

一些背景信息w.r.t。词法分析器和解析器:

  • Practical difference between parser rules and lexer rules in ANTLR?
  • lexers vs parsers