Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符串中的Antlr 4空格已消除_Antlr - Fatal编程技术网

字符串中的Antlr 4空格已消除

字符串中的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

我正在使用Antlr4为一种虚构的语言构建一个编译器。我在正确消除空白方面遇到了问题。它将消除标记之间的空白,但也会删除字符串标记中的空白,这显然不是我想要的。我尝试过使用模式来解决这个问题,但没有任何效果

Lexer.g4

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 : '"';