我对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
。
造成语法错误的原因是什么?我该如何纠正?
答案 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