运行lex和yacc时出现语法错误

时间:2014-04-07 16:57:21

标签: c compiler-construction bison yacc lex

我对lex和yacc很新。我正在尝试一种创建矩阵和语法的语法 执行一些操作,如adition,multiplication等。

这是我正在使用的语法

 program:     block ENDS
 block:       stmt | block ENDS stmt
 stmt:        defn_stmt | init_stmt | print_stmt | oper_stmt
 defn_stmt:   DEF definitions
 definitions: MATID OPENSQ NUMBER COMMA NUMBER CLOSEQ ENDS | 
              definitions COMMA MATID OPENSQ NUMBER COMMA NUMBER CLOSEQ ENDS
 init_stmt:   INIT MATID [mat_contents]
 mat_contents: NUMBER | mat_contents COMMA mat_contents | mat_contents RANGE mat_contents
 print_stmt:  PRINT MATID
 oper_stmt:   MATID mat_operator inputs | MATID CMUL inputs
 mat_operator: ADD | MMUL
 inputs: MATID COMMA MATID

但是对于以下输入,我会在第二个syntax error获得DEF

 DEF A [2,3]; // defines a 2X3 Matrix A.
 DEF I [2,3]; // defines a 2X3 Matrix A.
 DEF BA[2,3],C[2,3], D[3,4], E[2,4];

同时在运行yacc时显示conflicts: 4 shift/reduce

造成语法错误的原因是什么?我该如何纠正?

2 个答案:

答案 0 :(得分:2)

definitions必须以ENDS; ,显然)结束,这意味着defn_stmt必须以; 结尾。但是,stmt必须始终后跟; 。所以语法坚持定义后面跟着两个分号。

您应该从ENDS作品中删除defn_stmt。此外,您可能想要分解MATID OPENSQ NUMBER COMMA NUMBER CLOSEQ的两次出现;但是,这不是你问题的原因。

一个明显的模棱两可(实际上是两个)在制作中:

mat_contents: NUMBER
            | mat_contents COMMA mat_contents
            | mat_contents RANGE mat_contents

因为(指数)不明确如何解析:

NUMBER COMMA NUMBER COMMA NUMBER RANGE NUMBER COMMA NUMBER

您可以使用优先级声明来解决此问题,或者您可以更准确地使用语法。

答案 1 :(得分:1)

应该是这样的,未经验证。

program:       block ; 
block:         stmt | block ; stmt 
stmt:          defn_stmt | init_stmt | print_stmt | oper_stmt 
defn_stmt:     DEF   definitions
definitions:   MATID  [NUMBER,NUMBER]  |  definitions,  MATID [NUMBER,NUMBER]
init_stmt:     INIT MATID [mat_contents] 
mat_contents:  NUMBER |  mat_contents ,  mat_contents |  mat_contents :  mat_contents 
print_stmt:    PRINT MATID 
oper_stmt:     MATID mat_operator inputs |  MATID CMUL  inputs
mat_operator:  ADD | MMUL 
inputs:        MATID, MATID