我正在尝试使用以下规则解析一系列语句:语句必须至少用一个换行符分隔,并且序列可以用至少为零的换行符填充。例如,
\n
stmt\n
stmt\n
\n
stmt
到目前为止,我已经想出了这个Yacc语法,
stmt_list:
%empty
| stmt_list stmt seps
;
seps:
sep
| seps sep
;
但它与我的例子不符,因为我的语法最后会有一个换行符。 是否有解析这个的标准方法?感谢。
答案 0 :(得分:2)
一个简单(和传统)的解决方案是允许空语句:
program : statement
| program '\n' statement
statement: %empty
| statement_type_1
| ...
这并不能提供相同的解析树,因为它会强制你忽略一个空语句:)但它具有简单的优点。
否则,你会遇到类似的问题:
program : statement_list opt_newlines
statement_list: opt_newlines
| statement_list newlines statement
opt_newlines : %empty
| opt_newlines '\n'
newlines : '\n' opt_newlines