Я новичок в antlr, и я пишу грамматику antlr для DSL. Я пропустил пробел, чтобы справиться с этим. Но есть случай, когда я, необязательно хочу, чтобы моя грамматику, чтобы подобрать конкретный маркер с может иметь белые space.The вещей, которые я хочу достичь здесь в некотором смысле являетсяРазрешение пробелов в токене моей грамматики antlr
Токен SECATTR иметь пространства с отделанные задний и ведущий spaces.That что-то вроде
аа aa_aa aa.aa aa_aa аа следует рассматривать в качестве одного маркеров не доводя пространство при использовании в правиле синтаксического анализа singlerule из родаCOUNT(aa aa_aa aa.aa aa_aa aa )>10
. В настоящее время дерево формируется подобноРешить вопрос о , имеющих пробелы в моих правилах синтаксического анализа, такие как для singlerule
COUNT (aa aa_aa aa.aa aa_aa aa)>10
выдает ошибку из-за пространства после COUNT который, какИзбегайте неуклюжую синтаксический (если достижимы) моего маркера SECATTR, так как в настоящее время анализируется следующим образом для аа аа _aa aa.aa aa_aa аа (И я думаю, что это является основной причиной всех)
мне нужно справиться со всеми этими непечатаемыми осторожно, потому что моим другим правилом синтаксического анализа выраж сложен и основано на singlerule, и моя конечная цель состоит в том, чтобы иметь чистый способ разрешить токенизацию SECATTR иметь пробелы и все остальные места пробелы, которые следует игнорировать. Пожалуйста, предложите мне, где я ошибаюсь и что нужно улучшить.
grammar Test;
options {
language = Java;
}
fragment DIVIDE : '/';
fragment PLUS : '+';
fragment MINUS : '-';
fragment STAR : '*';
fragment MOD : '%';
LPAREN : '(';
RPAREN : ')';
fragment COMMA : ',';
fragment COLON : ':';
fragment LANGLEBRACKET : '<';
fragment RANGLEBRACKET : '>';
fragment EQ : '=';
fragment NOT : '!';
fragment UNDERSCORE : '_';
fragment DOT : '.';
fragment GRTRTHANEQTO : RANGLEBRACKET EQ;
fragment LESSTHANEQTO : LANGLEBRACKET EQ;
fragment NOTEQ : NOT EQ;
WS : ('\t'|'\f'|'\n'|'\r'|' ')+{ $channel=HIDDEN; };
fragment A:('a'|'A');
fragment B:('b'|'B');
fragment C:('c'|'C');
fragment D:('d'|'D');
fragment E:('e'|'E');
fragment F:('f'|'F');
fragment G:('g'|'G');
fragment H:('h'|'H');
fragment I:('i'|'I');
fragment J:('j'|'J');
fragment K:('k'|'K');
fragment L:('l'|'L');
fragment M:('m'|'M');
fragment N:('n'|'N');
fragment O:('o'|'O');
fragment P:('p'|'P');
fragment Q:('q'|'Q');
fragment R:('r'|'R');
fragment S:('s'|'S');
fragment T:('t'|'T');
fragment U:('u'|'U');
fragment V:('v'|'V');
fragment W:('w'|'W');
fragment X:('x'|'X');
fragment Y:('y'|'Y');
fragment Z:('z'|'Z');
OP1 : ((C O U N T | A V G | C O U N T D I S T I N C T)
| C A S T) ;
OP2 : DIVIDE|PLUS|MINUS|STAR|MOD
|LANGLEBRACKET|RANGLEBRACKET|EQ|GRTRTHANEQTO|LESSTHANEQTO|NOTEQ
|E Q U A L S | L I K E | N O T E Q U A L S | N O T L I K E | N O T N U L L;
OP3 : ((C O R R E S P O N D I N G | A N Y)|I);
OP4 : (A N D | O R);
DIGIT : ('0'..'9')+;
fragment Letter : ('a'..'z' | 'A'..'Z')+;
fragment Space : ' '+;
SECATTR :Letter (Letter|UNDERSCORE|DOT|Space)+
;
singlerule : SECATTR OP2 (DIGIT|Letter)
| OP1 LPAREN SECATTR RPAREN OP2 (DIGIT|Letter)
| SECATTR OP2 SECATTR
| OP1 LPAREN SECATTR RPAREN OP2 OP1 LPAREN SECATTR RPAREN
;
expr :((LPAREN? singlerule RPAREN?) OP4?)+
|((LPAREN (LPAREN singlerule RPAREN) OP4 (LPAREN singlerule RPAREN) RPAREN)+ (OP4 (LPAREN? singlerule RPAREN?))+ OP4?)+
| (LPAREN (LPAREN singlerule RPAREN) OP4 (LPAREN singlerule RPAREN) RPAREN OP3)+;
Не могли бы вы рассказать об этом? Я сожалею, что я новичок в ANTLR –
https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Lexer+Rules#LexerRules-channel() –
Я думаю, что сделал это, выполнив '{$ channel = HIDDEN; }; ' –