# Line number problem with the Synthesizer Generator.

## vdberg@cs.utwente.nl (Klaas van de Berg)Fri, 1 Jul 1994 15:13:18 GMT

From comp.compilers

Related articles
Line number problem with the Synthesizer Generator. vdberg@cs.utwente.nl (1994-07-01)
| List of all articles for this month |

 Newsgroups: comp.compilers From: vdberg@cs.utwente.nl (Klaas van de Berg) Keywords: tools, question Organization: Compilers Central Date: Fri, 1 Jul 1994 15:13:18 GMT

I have encountered the following problem with line numbers
in a calculator (a simple version of my original problem).
Besides the value of an expression I want to obtain
the line number of each constant in the expression in the input.

(e.g. Reps & Teitelbaum, 1989, The Synthesizer Generator, Ch 6
or: GrammaTech, 1993, The Synthesizer Generator Reference Manual,
appendix A)

For example, I have a file with the following content:
7

+
8

This should result in the following output:

(7 (at lnr:1) + 8 (at lnr:4))
VALUE = 15

The output shows the expression and the line number in the input file
for each constant, and the value of the expression.

It is clear to me that I should get the numbers at parse time.
However, I have not been successful until now.
The code of one of my unsuccessful attempts has been given below
(with the line numbers calculated after parsing the input file)

I will appreciate any suggestions in solving this problem.

Klaas van den Berg
University Twente
Enschede
the Netherlands
e-mail vdberg@cs.utwente.nl

***********************************************************************

#include "user_interface_exp.h"

{
}

/* abstract syntax */

root calc;
list calc;
calc : CalcNil()
| CalcPair(exp calc)
;
exp : Null()
| Sum(exp exp)
| Const(INT)
;

/* attribute declarations */

exp {syn INT v;
syn INT lnr;};

exp: Null { exp.v = 0;
exp.lnr = 0;}
| Sum { exp\$1.v = exp\$2.v + exp\$3.v;
exp\$1.lnr = exp\$2.lnr;}
| Const { exp\$1.v = INT;
exp\$1.lnr = LinesRead();} /* wrong place */
;

/* unparsing declarations */

calc : CalcPair [ @ ::= @ "%nVALUE = "exp.v [";%n%n"] @ ];
exp : Null [ @ ::= "<exp>"]
| Sum [ @ ::= "(" @ " + " @ ")"]
| Const [ @ ::= ^ " (at lnr:" exp.lnr ")" ]
;

/* transformation declarations */

transform exp
on "+" <exp>: Sum( <exp>,<exp>)
;

/* lexemes declarations */

INTEGER : Integer < [0-9]+ >;
WHITESPACE : Whitespace < [\ \t\n] >;
VALUE : Value < "VALUE" >;

/* parsing declarations */

Calc { syn calc abs; };
Exp { syn exp abs; };

Calc ::= (Exp) { Calc.abs = CalcPair(Exp.abs, CalcNil()); }
| (Exp Calc) { Calc\$1.abs = CalcPair(Exp.abs, Calc\$2.abs); }
;

Exp ::= (INTEGER) { \$\$.abs = Const(STRtoINT(INTEGER));}
| (Exp '+' Exp) { \$\$.abs = Sum(Exp\$2.abs, Exp\$3.abs);}
;

calc ~ Calc.abs;
exp ~ Exp.abs;

--

Post a followup to this message