我正在尝试使用ANTLR 3解析一些字符串......它们将用单引号括起来。因此,如果用户没有传递偶数个引号,它会一直运行到文件末尾,因为它假定它是一个巨大的字符串。
有没有办法指定ANTLR来识别EOF字符?我已经尝试过'<EOF>'
和'\\z'
了。
答案 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;