在 ANTLR4 中识别字符文字中的字符时出错

问题描述 投票:0回答:1

我需要在词法分析器中识别“字符文字”,但是我遇到了一些问题。

词法分析器规范如下:

lexer grammar LexerRules;

INT             :   'Int';
FLOAT           :   'Float';
STRING          :   'String';
BOOL            :   'Bool';
CHAR            :   'Character';
VAR             :   'var';
LET             :   'let';
FUNC            :   'func';
COLON           :   ':';
SEMI_COLON      :   ';';
PLUS            :   '+';
MINUS           :   '-';
MULTI           :   '*';
DIV             :   '/';
MOD             :   '%';
AND             :   '&&';
OR              :   '||';
NOT             :   '!';
LT              :   '<';
GT              :   '>';
LTE             :   '<=';
GTE             :   '>=';
ASSIGN          :   '=';
EQUAL           :   '==';
NOT_EQUAL       :   '!=';
SB_OPEN         :   '[';
SB_CLOSE        :   ']';
OPEN_CB         :   '{';
CLOSE_CB        :   '}';
OPEN_PAREN      :   '(';
CLOSE_PAREN     :   ')';
OPT             :   '?';
OP_DOT          :   '.';
ARROW           :   '->';
ELIP            :   '...';
IF              :   'if';
ELSE            :   'else';
SWITCH          :   'switch';
CASE            :   'case';
BREAK           :   'break';
WHILE           :   'while';
FOR             :   'for';
PRINT           :   'print';
STRUCT          :   'struct';
INT_LIT         :   '0'|DIGIT DIGIT*;
FLOAT_LIT       :   DIGIT+'.'DIGIT+;
CHAR_LIT        :   '\''(CHARACTER|ESCAPE_CHAR)'\'';
BOOL_LIT        :   'true'|'false';
STRING_LIT      :   '"'(~[\\"\r\n]|ESCAPE_CHAR)*'"';
NIL_LIT         :   'nil';
ID              :   [a-zA-Z_][a-zA-Z0-9_]+;
LINE_COMMENT    :   '//'.*?'\r'?'\n' -> skip;
COMMENT         :   '/*'.*?'*/' -> skip;
WS              :   [ \t\n\r]+ -> skip;

fragment
DIGIT           :   [0-9];
fragment
CHARACTER       :   [\u0032-\u0033\u0035-\u0091\u0093-\u0126];
fragment
ESCAPE_CHAR     :   '\\' [tnr"'\\];

我的问题是关于如何识别转义序列以进行进一步处理,目前我所拥有的如下:

CHAR_LIT        :   '\''(CHARACTER|ESCAPE_CHAR)'\'';
fragment
CHARACTER       :   [\u0032-\u0033\u0035-\u0091\u0093-\u0126];
fragment
ESCAPE_CHAR     :   '\\' [tnr"'\\];

有了这个,我能够识别大多数可打印的 ASCII 字符和基本转义序列,但我在识别某些字符时遇到冲突,例如,对于下面的每条指令:

print('+')

print('_')

print('*')

print('%')

产生以下输出:

第 1:6 行令牌识别错误:“+” 第 1:8 行令牌识别错误:'')' 第 1:10 行输入“;”不匹配期待 {INT_LIT、FLOAT_LIT、CHAR_LIT、BOOL_LIT , STRING_LIT, '无', ID, '-', '!', '('}

这似乎发生在我在词法分析器中定义的几乎所有符号上,+、-、*、/、%、&、| 等。

但是我无法弄清楚为什么会发生错误。

谢谢

regex parsing compiler-construction antlr4 lexer
1个回答
0
投票

可怕的错误,范围内的值是十六进制值,我输入了十进制值。例如,对于小写字母,范围为

[\u0061-\u007A]
© www.soinside.com 2019 - 2024. All rights reserved.