Разбор строки комментария - PullRequest
9 голосов
/ 16 августа 2011

Учитывая следующую базовую грамматику, я хочу понять, как я могу обрабатывать строки комментариев. Отсутствует обработка <CR><LF>, которая обычно завершает строку комментария - единственное исключение - последняя строка комментария перед EOF, т.е. g.:

# comment
abcd := 12 ;
# comment eof without <CR><LF>


grammar CommentLine1a;

//==========================================================
// Options
//==========================================================



//==========================================================
// Lexer Rules
//==========================================================

Int
  : Digit+
  ;

fragment Digit
  : '0'..'9'
  ;

ID_NoDigitStart
  : ( 'a'..'z' | 'A'..'Z' ) ('a'..'z' | 'A'..'Z' | Digit )*
  ;

Whitespace
  : ( ' ' | '\t' | '\r' | '\n' )+ { $channel = HIDDEN ; }
  ; 


//==========================================================
// Parser Rules
//==========================================================

code
  : ( assignment | comment )+
  ;

assignment
  : id_NoDigitStart ':=' id_DigitStart ';'
  ;

id_NoDigitStart
  : ID_NoDigitStart
  ;  

id_DigitStart
  : ( ID_NoDigitStart | Int )+
  ;

comment
  : '#' ~( '\r' | '\n' )*
  ;

1 Ответ

18 голосов
/ 16 августа 2011

Если у вас нет веской причины поместить комментарий в парсер (который я хотел бы услышать), вы должны поместить его в лексер:

Comment
  :  '#' ~( '\r' | '\n' )*
  ;

И так как вы уже учитываетеразрывы строк в вашем правиле Space, нет проблем с вводом, например # comment eof without <CR><LF>

Кроме того, если вы используете буквенные токены в правилах синтаксического анализатора, ANTLR автоматически создает их лексерные правила за кулисами.Так что в вашем случае:

comment
  :  '#' ~( '\r' | '\n' )*
  ;

будет соответствовать '#', за которым следует ноль или более токенов , отличных от '\r' и '\n' и не ноль или более символов, отличных от '\r' и '\n'.

Для дальнейшего использования:

Внутренние правила синтаксического анализатора

  • ~отменяет токены
  • . соответствует любому токену

Внутри правил лексера

  • ~ отменяет символы
  • . совпаденийлюбой символ в диапазоне 0x0000 ... 0xFFFF
...