This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | Next revision Both sides next revision | ||
semantic_tutorial [2015/11/09 22:11] deva [Step 6: Fixing the memory leaks] |
semantic_tutorial [2015/11/20 16:01] deva |
||
---|---|---|---|
Line 111: | Line 111: | ||
* Find out how is the non-terminal symbol for expressions is called in your grammar. (It is ''expression'' in the parser downloadable at the beginning of this tutorial, but it might have a different name in your own solution.) Since this is a non-terminal, you can define the type of its semantic value as follows. (Insert it near the token declarations at the beginning of ''while.y''.) | * Find out how is the non-terminal symbol for expressions is called in your grammar. (It is ''expression'' in the parser downloadable at the beginning of this tutorial, but it might have a different name in your own solution.) Since this is a non-terminal, you can define the type of its semantic value as follows. (Insert it near the token declarations at the beginning of ''while.y''.) | ||
<code> | <code> | ||
- | %type expr_type expression | + | %type <expr_type> expression |
</code> | </code> | ||
* For each //expression rule//, do the necessary type checking and set the semantic value of the left-hand side of the rule. The semantic value of the left-hand side can be referenced by the ''$$'' symbol. | * For each //expression rule//, do the necessary type checking and set the semantic value of the left-hand side of the rule. The semantic value of the left-hand side can be referenced by the ''$$'' symbol. | ||
Line 118: | Line 118: | ||
* In case of expressions build using operators, there is need for type checking the arguments. For example, the rule for addition will have this C++ code: | * In case of expressions build using operators, there is need for type checking the arguments. For example, the rule for addition will have this C++ code: | ||
<code> | <code> | ||
- | if($1->expr_type != integer || $3->expr_type != integer) | + | if(*$1 != integer || *$3 != integer) |
{ | { | ||
std::stringstream ss; | std::stringstream ss; |