我需要在词法分析器中识别“字符文字”,但是我遇到了一些问题。
词法分析器规范如下:
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, '-', '!', '('}
这似乎发生在我在词法分析器中定义的几乎所有符号上,+、-、*、/、%、&、| 等。
但是我无法弄清楚为什么会发生错误。
谢谢
可怕的错误,范围内的值是十六进制值,我输入了十进制值。例如,对于小写字母,范围为
[\u0061-\u007A]