Generating Software from Specifications WS 2013/14 - File TryScan.fw
@=~
~p maximum_input_line_length = infinity
The concrete grammar specifies a sequence of Elements
separated by commas. The elements are named terminals.
~O~<TryScan.con~>~{
Specification: Sequence.
Sequence: Sequence ',' Element / Element.
Element: Ident / Number.
~}
Two tokens are specified here.
Replace them by your favorite token notations and
test the generated scanner and parser:
~O~<TryScan.gla~>~{
Ident: $[a-zA-Z][a-zA-Z0-9]* [myToken]
Number: $[0-9]+ [myToken]
~}
Here is a correct input file:
~O~<in.ok~>~{~-
~}
Here is an erroneous input file:
~O~<in.err~>~{~-
~}
The following rules of the abstract syntax are used in Exercise 6c
to output token encodings.
~O~<TokenSpecs.lido~>~{
RULE p1: Element ::= Ident COMPUTE
/*
printf ("p1: token code %d in line %d\n", Ident, LINE);
*/
END;
RULE p2: Element ::= Number COMPUTE
/*
printf ("p2: token code %d in line %d\n", Number, LINE);
*/
END;
~}
The following three macros implement a little C module.
It defines functions to be called as a token encoding functions.
In the present state myToken only prints some information on every
accepted token:
~O~<TryScan.HEAD.phi~>~{
#include "csm.h"
#include "TryScan.h"
~}
~O~<TryScan.h~>~{
extern void myToken (char *start, int length, int *class, int *intrinsic);
extern void mkDay (char *start, int length, int *class, int *intrinsic);
~}
~O~<TryScan.c~>~{
#include <stdio.h>
#include "TryScan.h"
int count = 0;
void myToken (char *start, int length, int *class, int *intrinsic)
{
*intrinsic=count++;
printf ("token %d first char >%c<\n", count, *start);
}
void mkDay (char *d, int l, int *c, int *i)
{
switch (d[0]) {
case 'F': *i = 5; break;
case 'M': *i = 1; break;
case 'W': *i = 3; break;
case 'S': *i = (d[1] == 'a'? 6 : 7); break;
case 'T': *i = (d[1] == 'u' ? 2 : 4); break;
}
}
~}
Generiert mit Camelot | Probleme mit Camelot? | Geändert am: 30.10.2013


