2014-02-21 3 views
2

Я новичок в antlr, и я пишу грамматику antlr для DSL. Я пропустил пробел, чтобы справиться с этим. Но есть случай, когда я, необязательно хочу, чтобы моя грамматику, чтобы подобрать конкретный маркер с может иметь белые space.The вещей, которые я хочу достичь здесь в некотором смысле являетсяРазрешение пробелов в токене моей грамматики antlr

  1. Токен SECATTR иметь пространства с отделанные задний и ведущий spaces.That что-то вроде
    аа aa_aa aa.aa aa_aa аа следует рассматривать в качестве одного маркеров не доводя пространство при использовании в правиле синтаксического анализа singlerule из рода COUNT(aa aa_aa aa.aa aa_aa aa )>10. В настоящее время дерево формируется подобно The token SECATTR having spaces in lead

  2. Решить вопрос о , имеющих пробелы в моих правилах синтаксического анализа, такие как для singleruleCOUNT (aa aa_aa aa.aa aa_aa aa)>10 выдает ошибку из-за пространства после COUNT который, как single rule with spaces

  3. Избегайте неуклюжую синтаксический (если достижимы) моего маркера SECATTR, так как в настоящее время анализируется следующим образом для аа аа _aa aa.aa aa_aa аа (И я думаю, что это является основной причиной всех) Multiple breakdown of SECATTR

мне нужно справиться со всеми этими непечатаемыми осторожно, потому что моим другим правилом синтаксического анализа выраж сложен и основано на 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)+; 

ответ

0

ANTLR 3 и 4 имеют функцию, называемую токен-каналами. Вы можете отправлять свои пробелы/комментарии и т. Д. В парсер на другом канале. Они находятся в потоке токенов для использования, но не анализируются парсером.

+1

Не могли бы вы рассказать об этом? Я сожалею, что я новичок в ANTLR –

+0

https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Lexer+Rules#LexerRules-channel() –

+1

Я думаю, что сделал это, выполнив '{$ channel = HIDDEN; }; ' –