Yacc / Bison语法用于语句序列

时间:2014-11-11 14:17:00

标签: grammar bison yacc

我正在尝试使用以下规则解析一系列语句:语句必须至少用一个换行符分隔,并且序列可以用至少为零的换行符填充。例如,

\n
stmt\n
stmt\n
\n
stmt

到目前为止,我已经想出了这个Yacc语法,

stmt_list:
    %empty
|   stmt_list stmt seps
;

seps:
    sep
| seps sep
;

但它与我的例子不符,因为我的语法最后会有一个换行符。 是否有解析这个的标准方法?感谢。

1 个答案:

答案 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