使用 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
只能由其他词法分析器规则使用,永远不能在解析器规则中使用。从 COLON
和 AT
规则中删除 fragment
关键字。
一些背景信息w.r.t。词法分析器和解析器:
- Practical difference between parser rules and lexer rules in ANTLR?
- lexers vs parsers
我正在尝试使用 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
只能由其他词法分析器规则使用,永远不能在解析器规则中使用。从 COLON
和 AT
规则中删除 fragment
关键字。
一些背景信息w.r.t。词法分析器和解析器:
- Practical difference between parser rules and lexer rules in ANTLR?
- lexers vs parsers