识别Antlr3 Lexer中的EOF文件字符

时间:2011-03-29 15:51:21

标签: antlr antlr3

我正在尝试使用ANTLR 3解析一些字符串......它们将用单引号括起来。因此,如果用户没有传递偶数个引号,它会一直运行到文件末尾,因为它假定它是一个巨大的字符串。

有没有办法指定ANTLR来识别EOF字符?我已经尝试过'<EOF>''\\z'了。

2 个答案:

答案 0 :(得分:1)

要在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)。 char '\z'不是ANTLR规则中的有效转义字符。

答案 1 :(得分:0)

由于某种原因EOF对我不起作用(使用antlr v4) 另一种方法是在上层处理EOF。例如,如果您以这种方式将EOF定义为语句分隔符:

program     : statement+ ;
statement   : some_stuff NEWLINE;

您可以替换为:

program     : (statement NEWLINE)* statement? ;
statement   : some_stuff;