Проблема с созданием определения грамматики с помощью antlr

В настоящее время я следую руководству Frederico Tomasetti Antlr, однако при попытке сгенерировать определение грамматики antlr я получаю следующую ошибку.

Chat.g4:52:26: syntax error: ']' came as a complete surprise to me

Chat.g4:52:25 syntax error: mismatched input ')' expecting SEMI while matching a lexer rule

Кто-нибудь может увидеть, где я ошибся?

Мой файл g4:

 1  grammar Chat;
 2  
 3  /*
 4   * Parser Rules
 5   */
 6   
 7  chat                : line+ EOF ;
 8   
 9  line                : name command message NEWLINE;
10   
11  message             : (emoticon | link | color | mention | WORD | WHITESPACE)+ ;
12   
13  name                : WORD WHITESPACE;
14   
15  command             : (SAYS | SHOUTS) ':' WHITESPACE ;
16                                          
17  emoticon            : ':' '-'? ')'
18                      | ':' '-'? '('
19                      ;
20   
21  link                : '[' TEXT ']' '(' TEXT ')' ;
22   
23  color               : '/' WORD '/' message '/';
24   
25  mention             : '@' WORD ;
26  
27  /*
28   * Lexer Rules
29   */
30   
31  fragment A          : ('A'|'a') ;
32  fragment S          : ('S'|'s') ;
33  fragment Y          : ('Y'|'y') ;
34  fragment H          : ('H'|'h') ;
35  fragment O          : ('O'|'o') ;
36  fragment U          : ('U'|'u') ;
37  fragment T          : ('T'|'t') ;
38   
39  fragment LOWERCASE  : [a-z] ;
40  fragment UPPERCASE  : [A-Z] ;
41   
42  SAYS                : S A Y S ;
43   
44  SHOUTS              : S H O U T S;
45   
46  WORD                : (LOWERCASE | UPPERCASE | '_')+ ;
47   
48  WHITESPACE          : (' ' | '\t') ;
49   
50  NEWLINE             : ('\r'? '\n' | '\r')+ ;
51   
52  TEXT                : ~[])]+ ;

Любая помощь будет оценена по достоинству.

0
0
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
TEXT                : ~[])]+ ;

Вы не можете использовать ] без экранирования в классе символов - даже в начале. Вам нужно будет поставить перед ним обратную косую черту: ~[\])]+.

Другие вопросы по теме