2013-01-23 44 views
1

我必须使用YACC来实现字符串操作的计算机。我必须实现像+(用于连接字符串)或*(strcat自身n次的字符串)的操作。这些操作返回一个字符串并我在非终结符t1中使用它们.BUt我也有操作返回一个数字。这些操作在一个t2非终结符中。lex yacc nonterminal circularity

,比如我有:

 expr1: expr1 '+' expr1 { strcpy($$,$1); strcat($$,$3);} 
     | expr1 '-' expr1 { strcpy($$,minus($1,$3));}  
      | | expr1 '*' NUMBER {strcpy($$,mul($1,$3));} 
      |STRING; 

,我有:

 expr2 : STRING '?' STRING {strcpy($$nr_of_aparitions($1,$3));} 
; 

的事情是,在表达式2所定义的操作总是会返回一个数字。 所有工作正常,直到:

如果我有'dfdf'? 'edfd“,例如它一切正常。问题来了,当我必须在expr2:expr1?expr2中实现expr1,因为圆形会出现。你可以提出什么建议吗?

+0

你是否还想过运算符优先级和关联性。例如,'expr1 - expr2 + expr3'是什么意思? – Eduardo

回答

1

一般来说,你不需要关心你称之为“循环”,我称之为“递归”,即在expr1中使用数值表达式,反之亦然。

我会按照如下方式重写你的语法片段,以使你的代码更容易了解:

stringExpr : stringExpr '+' stringExpr { strcpy($$,$1); strcat($$,$3); } 
      | stringExpr '-' stringExpr { strcpy($$,minus($1,$3)); }  
      | stringExpr '*' numberExpr { strcpy($$,mul($1,$3)); } 
      | STRING 
      ; 

numberExpr : stringExpr '?' stringExpr { strcpy($$nr_of_aparitions($1,$3)); } 
      | NUMBER 
      ; 

(我删除了你的表达式1空的规则 - 我想这并不打算。)

我想知道为什么你没有普通算术的语法规则,像5 + 2这样的表达式,但也许这不是你的计划的一部分。

如果你打算支持普通算术,那么你将需要考虑如何解释"foobar" - 1 + 1。此时,您可能需要查看operator precedence的yacc/bison功能。