Fri, 1 Jul 1994 15:13:18 GMT

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;

--

Post a followup to this message

Return to the
comp.compilers page.

Search the
comp.compilers archives again.