运行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错误?如何更正它?定义必须以结尾
(;)结尾,这意味着定义必须以;。但是,astmt
后面必须始终跟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
您可以使用优先级声明来解决这个问题,也可以更精确地使用语法。定义必须以结尾(;),这意味着定义必须以;。但是,astmt
后面必须始终跟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
您可以使用优先级声明来解决这个问题,也可以更精确地使用语法。定义必须以结尾(;),这意味着定义必须以;。但是,astmt
后面必须始终跟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
您可以使用优先级声明来解决这个问题,也可以更精确地使用语法。定义必须以结尾(;),这意味着定义必须以;。但是,astmt
后面必须始终跟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是分号,在这种情况下,您