Related articles |
---|
Line number problem with the Synthesizer Generator. vdberg@cs.utwente.nl (1994-07-01) |
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.
The function lines_read() seems appropriate.
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"
FOREIGN LinesRead()
{
return Int(lines_read());
}
INT foreign LinesRead();
/* 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;
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.