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

运行lex和yacc时出现语法错误,c,compiler-construction,bison,yacc,lex,C,Compiler Construction,Bison,Yacc,Lex,我对莱克斯和亚克还很陌生。我在尝试一种创建矩阵和 执行一些操作,如加法、乘法等 这是我正在使用的语法 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

我对莱克斯和亚克还很陌生。我在尝试一种创建矩阵和 执行一些操作,如加法、乘法等

这是我正在使用的语法

 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
但是对于以下输入,我在第二个
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时,它还显示
冲突:4 shift/reduce


是什么导致了这里的Syntaxer错误?如何更正它?

定义必须以
结尾
(;)结尾,这意味着
定义必须以;。但是,a
stmt
后面必须始终跟a;。因此语法坚持一个定义后面跟两个分号

您应该从
defn\u stmt
产品中删除
end
。此外,您可能希望排除两次出现的
MATID OPENSQ NUMBER逗号NUMBER CLOSEQ
;但这不是你问题的原因

一个明显的歧义(实际上是两个)存在于产品中:

mat_contents: NUMBER
            | mat_contents COMMA mat_contents
            | mat_contents RANGE mat_contents
由于(指数)不明确如何解析:

NUMBER COMMA NUMBER COMMA NUMBER RANGE NUMBER COMMA NUMBER

您可以使用优先级声明来解决这个问题,也可以更精确地使用语法。

定义必须以
结尾
(;),这意味着
定义必须以;。但是,a
stmt
后面必须始终跟a;。因此语法坚持一个定义后面跟两个分号

您应该从
defn\u stmt
产品中删除
end
。此外,您可能希望排除两次出现的
MATID OPENSQ NUMBER逗号NUMBER CLOSEQ
;但这不是你问题的原因

一个明显的歧义(实际上是两个)存在于产品中:

mat_contents: NUMBER
            | mat_contents COMMA mat_contents
            | mat_contents RANGE mat_contents
由于(指数)不明确如何解析:

NUMBER COMMA NUMBER COMMA NUMBER RANGE NUMBER COMMA NUMBER

您可以使用优先级声明来解决这个问题,也可以更精确地使用语法。

定义必须以
结尾
(;),这意味着
定义必须以;。但是,a
stmt
后面必须始终跟a;。因此语法坚持一个定义后面跟两个分号

您应该从
defn\u stmt
产品中删除
end
。此外,您可能希望排除两次出现的
MATID OPENSQ NUMBER逗号NUMBER CLOSEQ
;但这不是你问题的原因

一个明显的歧义(实际上是两个)存在于产品中:

mat_contents: NUMBER
            | mat_contents COMMA mat_contents
            | mat_contents RANGE mat_contents
由于(指数)不明确如何解析:

NUMBER COMMA NUMBER COMMA NUMBER RANGE NUMBER COMMA NUMBER

您可以使用优先级声明来解决这个问题,也可以更精确地使用语法。

定义必须以
结尾
(;),这意味着
定义必须以;。但是,a
stmt
后面必须始终跟a;。因此语法坚持一个定义后面跟两个分号

您应该从
defn\u stmt
产品中删除
end
。此外,您可能希望排除两次出现的
MATID OPENSQ NUMBER逗号NUMBER CLOSEQ
;但这不是你问题的原因

一个明显的歧义(实际上是两个)存在于产品中:

mat_contents: NUMBER
            | mat_contents COMMA mat_contents
            | mat_contents RANGE mat_contents
由于(指数)不明确如何解析:

NUMBER COMMA NUMBER COMMA NUMBER RANGE NUMBER COMMA NUMBER

您可以使用优先级声明来解决这个问题,也可以在语法上更加精确。

应该是这样的,而不是经过验证

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 程序:块; 区块:stmt |区块;stmt stmt:defn|u stmt | init|stmt | print|u stmt | oper|stmt 定义:定义定义 定义:MATID[NUMBER,NUMBER]|定义,MATID[NUMBER,NUMBER] init_stmt:init MATID[mat_contents] 物料内容:数量|物料内容,物料内容|物料内容:物料内容 打印时间:打印MATID 操作stmt:MATID mat|U操作员输入| MATID CMUL输入 mat|u运算符:添加| MMUL 输入:MATID,MATID
应该是这样的,没有经过验证

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 程序:块; 区块:stmt |区块;stmt stmt:defn|u stmt | init|stmt | print|u stmt | oper|stmt 定义:定义定义 定义:MATID[NUMBER,NUMBER]|定义,MATID[NUMBER,NUMBER] init_stmt:init MATID[mat_contents] 物料内容:数量|物料内容,物料内容|物料内容:物料内容 打印时间:打印MATID 操作stmt:MATID mat|U操作员输入| MATID CMUL输入 mat|u运算符:添加| MMUL 输入:MATID,MATID
应该是这样的,没有经过验证

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 程序:块; 区块:stmt |区块;stmt stmt:defn|u stmt | init|stmt | print|u stmt | oper|stmt 定义:定义定义 定义:MATID[NUMBER,NUMBER]|定义,MATID[NUMBER,NUMBER] init_stmt:init MATID[mat_contents] 物料内容:数量|物料内容,物料内容|物料内容:物料内容 打印时间:打印MATID 操作stmt:MATID mat|U操作员输入| MATID CMUL输入 mat|u运算符:添加| MMUL 输入:MATID,MATID
应该是这样的,没有经过验证

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 程序:块; 区块:stmt |区块;stmt stmt:defn|u stmt | init|stmt | print|u stmt | oper|stmt 定义:定义定义 定义:MATID[NUMBER,NUMBER]|定义,MATID[NUMBER,NUMBER] init_stmt:init MATID[mat_contents] 物料内容:数量|物料内容,物料内容|物料内容:物料内容 打印时间:打印MATID 操作stmt:MATID mat|U操作员输入| MATID CMUL输入 mat|u运算符:添加| MMUL 输入:MATID,MATID
那里没有足够的信息可以告诉你-你所有终端的定义都丢失了。然而,您的语法似乎根本不包含任何处理输入中分号的内容…@twalberg ENDS是分号,在这种情况下,您