不同数据类型的Yacc

问题描述 投票:0回答:1

我正在尝试编写语法,以使用户可以使用它们用于多次计算的运算符号。例如,A + B,其中A和B是矩阵或数字。这是语法的相关部分:

q_term: fraction    
| q_term '+' fraction   {$$ = q_add($1,$3);}
| q_term '-' fraction   {$$ = q_sub($1,$3);}
| q_term '*' fraction   {$$ = q_mul($1,$3);}
| q_term '/' fraction   {$$ = q_div($1,$3);}
;

qm_term: q_matrix   
| qm_term '+' q_matrix  {$$ = qm_add($1,$3);}
| qm_term '-' q_matrix  {$$ = qm_sub($1,$3);}
| qm_term '*' q_matrix  {$$ = qm_mul($1,$3);}
;

它给了我很多移位/减少错误。我认为这是因为它可以在多个位置看到操作字符。

如何解决班次减少错误?

编辑:

解析器如何分辨矩阵和标量之间的差异

q_term: fraction    
| q_term '+' fraction   {$$ = q_add($1,$3);}
| q_term '-' fraction   {$$ = q_sub($1,$3);}
| q_term '*' fraction   {$$ = q_mul($1,$3);}
| q_term '/' fraction   {$$ = q_div($1,$3);}
;

q_matrix: '[' q_term    {qm_temp = qm_create();  qm_append(qm_temp,$2,'c');}/* new q_matrix */
| q_matrix ',' q_term {qm_append(qm_temp,$3,'c');}  /* add a number to the current q_matrix row */
| q_matrix ';' q_term {qm_append(qm_temp,$3,'r');}  /* add a new row */
| q_matrix ']'  {qm_finish(qm_temp); $$ = qm_copy_matrix(qm_temp);} /* close the list */
;

fraction: INTEGER {$$ = q_new($1,1);} /* this converts a lone integer into a fraction */
| INTEGER '|' INTEGER {$$ = q_new($1,$3);}
grammar yacc
1个回答
0
投票

在没有变量的语言中(例如,一个简单的计算器),在解析过程中可以区分不同类型的表达式,前提是不可能自动将一种类型强制转换(转换)为另一种类型。

但是实际上,每次都重复输入完整的矩阵会很麻烦。您和您的其他用户将很快需要某种方式将矩阵常量保存为命名对象。如果命名对象也可以是标量,则您要么必须坚持认为对象的名称以某种方式表示类型(例如,矩阵可能必须用大写字母或类似的字母写成),或者更可能是最终将无法在解析期间知道名称是标量表达式还是矩阵表达式。到那时,您可能在语法分析过程中为区分两种类型的表达式而构建的任何复杂语法都会变得毫无意义。

因此,我的建议是避免自己感到烦恼。初始解析应仅构建某种形式的AST,然后您可以遍历树以执行所需的任何语义分析,包括解析多态运算符和插入自动强制(如果有)。

© www.soinside.com 2019 - 2024. All rights reserved.