字符串中的Antlr 4空格已消除
我正在使用Antlr4为一种虚构的语言构建一个编译器。我在正确消除空白方面遇到了问题。它将消除标记之间的空白,但也会删除字符串标记中的空白,这显然不是我想要的。我尝试过使用模式来解决这个问题,但没有任何效果 Lexer.g4字符串中的Antlr 4空格已消除,antlr,Antlr,我正在使用Antlr4为一种虚构的语言构建一个编译器。我在正确消除空白方面遇到了问题。它将消除标记之间的空白,但也会删除字符串标记中的空白,这显然不是我想要的。我尝试过使用模式来解决这个问题,但没有任何效果 Lexer.g4 lexer grammar WaccLexer; SEMICOLON: ';' ; WS: [ \n\t\r\u000C]+ -> skip; EOL: '\n' ; BEGIN: 'begin' ; END: 'end' ; SKIP: 'skip' ; RE
lexer grammar WaccLexer;
SEMICOLON: ';' ;
WS: [ \n\t\r\u000C]+ -> skip;
EOL: '\n' ;
BEGIN: 'begin' ;
END: 'end' ;
SKIP: 'skip' ;
READ: 'read' ;
FREE: 'free' ;
RETURN: 'return' ;
EXIT: 'exit' ;
IS: 'is' ;
PRINT: 'print' ;
PRINTLN: 'println' ;
IF: 'if' ;
THEN: 'then' ;
ELSE: 'else' ;
FI: 'fi' ;
WHILE: 'while' ;
DO: 'do' ;
DONE: 'done' ;
NEWPAIR: 'newpair' ;
CALL: 'call' ;
FST: 'fst' ;
SND: 'snd' ;
INT: 'int' ;
BOOL: 'bool' ;
CHAR: 'char' ;
STRING: 'string' ;
PAIR: 'pair' ;
EXCLAMATION: '!' ;
LEN: 'len' ;
ORD: 'ord' ;
TOINT: 'toInt' ;
DIGIT: '0'..'9' ;
LOWCHAR: 'a'..'z' ;
R: 'r' ;
F: 'f' ;
N: 'n' ;
T: 't' ;
B: 'b' ;
ZERO: '0' ;
MULTI: '*' ;
DIVIDE: '/' ;
MOD: '%' ;
PLUS: '+' ;
MINUS: '-' ;
GT: '>' ;
GTE: '>=' ;
LT: '<' ;
LTE: '<=' ;
DOUBLEEQUAL: '==' ;
EQUAL: '=' ;
NOTEQUAL: '!=' ;
AND: '&&' ;
OR: '||' ;
UNDERSCORE: '_' ;
UPCHAR: 'A'..'Z' ;
OPENSQUARE: '[' ;
CLOSESQUARE: ']' ;
OPENPARENTHESIS: '(' ;
CLOSEPARENTHESIS: ')' ;
TRUE: 'true' ;
FALSE: 'false' ;
SINGLEQUOT: '\'' ;
DOUBLEQUOT: '\"' ;
BACKSLASH: '\\' ;
COMMA: ',' ;
NULL: 'null' ;
OPENSTRING : DOUBLEQUOT -> pushMode(STRINGMODE) ;
COMMENT: '#' ~[\r\n]* '\r'? '\n' -> skip ;
mode STRINGMODE ;
CLOSESTRING : DOUBLEQUOT -> popMode ;
CHARACTER : ~[\"\'\\] | (BACKSLASH ESCAPEDCHAR) ;
STRLIT : (CHARACTER)* ;
ESCAPEDCHAR : ZERO
| B
| T
| N
| F
| R
| DOUBLEQUOT
| SINGLEQUOT
| BACKSLASH
;
还请记住,以开头的注释需要忽略。提前感谢。OPENSTRING lexer规则在语法中永远不会匹配,因为DoubleQuote规则完全匹配相同的输入序列,并在语法中出现在它之前。如果要定义lexer规则,但实际上不希望该lexer规则自己创建令牌,则需要使用片段修饰符定义该规则
fragment DOUBLEQUOT : '"';
此外,还需要更正为语法生成代码时出现的警告。其中至少有一个定义为表示您犯了一个重大错误,该错误曾是ANTLR 4.0中的一个错误,但在ANTLR 4.1中已更改为警告,因为存在一个可以毫无问题地使用的边缘情况。Hi here,谢谢你的回答-我已经解决了最初的问题并理解了问题所在,但是EPSILON_标记错误似乎是不可避免的。。STRLIT用于匹配任意长度的字符串,空字符串也需要匹配-我如何重新构造Lexer文件以同时接受空字符串?@user2984636在您的情况下,空字符串不会有STRLIT标记,只有一个OPENSTRING,后面跟着CLOSESTRING。我现在已经解决了我的问题,但还有一个问题,双引号被忽略了,错误是没有可行的替代方案-我将发布另一个问题。谢谢
fragment DOUBLEQUOT : '"';