Распознавание символа файла EOF в Antlr3 Lexer

Я пытаюсь разобрать некоторые строки с помощью ANTLR 3... они должны быть заключены в одинарные кавычки. Поэтому, если пользователь не передает четное количество кавычек, он выполняется до конца файла, поскольку предполагает, что это массивная строка.

Есть ли способ указать ANTLR для распознавания символа EOF? Я пробовал '<EOF>' и '\\z', и теперь они помогают.


person edd    schedule 29.03.2011    source источник
comment
EOF означает конец файла, а не конец строки. Если вы пытаетесь предотвратить чтение ANTLR до конца файла, то EOF определенно не то, что вам нужно, потому что это конкретно означает, что вы хотите прочитать его до конца файла.   -  person Sam Harwell    schedule 27.07.2013


Ответы (2)


Чтобы обработать строковый литерал с одной кавычкой в ​​ANTLR, вы должны сделать что-то вроде этого:

SingleQuotedString
  :  '\'' ('\\' ('\\' | '\'') | ~('\\' | '\'' | '\r' | '\n'))* '\''
  ;

значение:

'\''                              # a single quote
(                                 # (
  '\\' ('\\' | '\'')              #   a backslash followed by \ or '
  |                               #   OR
  ~('\\' | '\'' | '\r' | '\n')    #   any char other than \, ', \r and \n
)*                                # ) zero or more times
'\''                              # a single quote

А для обозначения маркера конца файла внутри правил ANTLR просто используйте EOF:

parse
  :  SingleQuotedString+ EOF
  ;

который будет соответствовать одному или нескольким SingleQuotedString, за которыми следует конец файла (EOF). Символ '\z' не является допустимым escape-символом в правилах ANTLR.

person Bart Kiers    schedule 29.03.2011

По какой-то причине EOF у меня не сработало (использую antlr v4). Альтернативой является обработка EOF на верхнем уровне. Например, если вы определяете EOF как разделитель операторов следующим образом:

program     : statement+ ;
statement   : some_stuff NEWLINE;

Вы можете заменить на:

program     : (statement NEWLINE)* statement? ;
statement   : some_stuff;
person Sylvain Lecorné    schedule 27.07.2013
comment
Я думаю, вы путаете EOF (конец файла и предопределенный токен в ANTLR) с EOL (конец строки). - person Sam Harwell; 27.07.2013