Generating Software from Specifications WS 2013/14 - File parsing2Sol.fw
@=~
~p maximum_input_line_length = infinity
This file contains the specification of a language
for sequences of declarations and statements.
Try to generate a processor for it.
If the parser generation indicates problems, analyse their
reasons and eliminate them.
The following file contains correct input for the processor:
Give an example for a correct input:
~O~<Expression.ok~>~{~-
int (b);
h(a);
bool (c);
string (s);
a = 42;
g(a);
f(a+1);
~}
The following file specifies the concrete syntax:
~O~<Expression.ambig~>~{
Program: Declarations Statements.
Declarations: Declarations Declaration / Declaration.
Statements: Statements Statement / Statement.
Declaration: Type '(' Ident ')' ';'.
Type: 'int' / 'bool' / Ident.
Statement: Assignment / Call.
Assignment: VarIdent '=' Expression ';'.
VarIdent: Ident.
Expression: Expression '+' Operand / Operand.
Operand: Number / VarIdent.
Call: Ident '(' Expression ')' ';'.
~}
The grammar is ambiguous.
The parser generator indicates that a construct "Ident ( Ident );"
can be reduced to a Declaration or to a Statement.
If it occurs after some number of Declarations, it may be reduced
to the one or the other nonterminal.
The problem can be solved: Restrict Declarations to those which
have not the form of a call. Then specify a sequence which begins
with Declarations and Calls, after the first Assignment only
Assignments and calls may follow.
The language of the following grammar is a superset of the language
of the ambiguous grammar. The constructs which could be reduced
to a Declaration or to a Statement have to be checked by semantic
analysis, whether they are a Statement or a Declaration, and are
allowed at their position in the sequence.
~O~<Expression.con~>~{
Program: A.
A: Declaration B / Call B.
B: Declaration B / Call B / Assignment C / .
C: Assignment C / Call C / .
Declaration: PlainType '(' Ident ')' ';'.
PlainType: 'int' / 'bool'.
Call: Ident '(' Expression ')' ';'.
Assignment: VarIdent '=' Expression ';'.
VarIdent: Ident.
Expression: Expression '+' Operand / Operand.
Operand: Number / VarIdent.
~}
The following file specifies the non-literal tokens:
~O~<Expression.gla~>~{
Ident: C_IDENTIFIER
Number: C_INTEGER
~}
Generiert mit Camelot | Probleme mit Camelot? | Geändert am: 13.11.2013


