Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing ANTLR4-逐行解析文件_Parsing_Antlr4 - Fatal编程技术网

Parsing ANTLR4-逐行解析文件

Parsing ANTLR4-逐行解析文件,parsing,antlr4,Parsing,Antlr4,我试图写一个语法来逐行解析文件 我的语法是这样的: grammar simple; parse: (line NL)* EOF line : statement1 | statement2 | // empty line ; statement1 : KW1 (INT|FLOAT); statement2 : KW2 INT; ... NL : '\r'? '\n'

我试图写一个语法来逐行解析文件

我的语法是这样的:

grammar simple;

parse: (line NL)* EOF
line    
     : statement1     
     | statement2 
     |            // empty line           
     ;

statement1 : KW1 (INT|FLOAT);
statement2 : KW2 INT;

... 

NL          : '\r'? '\n';
WS          : (' '|'\t')-> skip; // toss out whitespace
如果输入文件中的最后一行没有换行符,我会收到以下错误消息:

line xx:37 missing NL at <EOF>
第xx行:37处缺少NL

有人能解释一下,如何编写一个语法,实际上接受最后一行而不使用换行符,而不要求
NL
落在最后一行之后。由于
可以匹配空序列(基本上最后一行始终是空行),因此该表单是有效的,并且是简化的

如果
不允许为空,则以下规则有效并执行相同的操作:

// best if `line` cannot be empty
parse
  : (line (NL line)* NL?)? EOF
  ;
以下规则适用于
不能为空,但效率要低得多的情况。我之所以将其包括在内,是因为我经常看到人们以这种形式编写规则,很容易看到特定的
NL
标记是可选的,它位于最后一行
之后

// INEFFICIENT!
parse
  : (line NL)* (line NL?)? EOF
  ;
// INEFFICIENT!
parse
  : (line NL)* (line NL?)? EOF
  ;