EBNF-Analysis
First off all the programs EBNF for feed:
* Syntax = {Production} ".".
Production = Identifier "=" Expression ".".
Expression = Term {"|" Term}.
Term = Factor {Factor}.
Factor = Identifier |
Literal |
"(" Expression ")" |
"[" Expression "]" |
"{" Expression "}" .
Identifier= "A" | "B" | "C" {Identifier}.
Literal= "'" ( "a" | "b" | "c" | "1" | "2" | "3") "'".
.
now her's the program:
{ ************************************************************
Name : EBNF
Description : Syntax-Analysis for EBNF, equal to
program 2, N.Wirth Compilerbau, page 32.
Date : 94.09.02
Author : H.Mucker
************************************************************}
PROGRAM Ebnf (input,output);
CONST MAXSTRLEN = 15;
LOWER = ['a'..'z'];
UPPER = ['A'..'Z'];
CIPHER = ['0'..'9'];
VAR ch : char;
inFile : text;
symbol : tString;
{ ************************************************************
S T R I N G - P R O D E D U R E S
************************************************************}
PROCEDURE StrReadln (VAR ioString : tString);
VAR i : integer;
ch : char;
BEGIN
i:= 1;
REPEAT
read(ch);
ioString[i]:= ch;
i:= i+1
UNTIL EOLN(input) or (i > MAXSTRLEN);
readln;
IF i <= MAXSTRLEN THEN
REPEAT
ioString[i]:= chr(32);
i:= i+1
UNTIL i > MAXSTRLEN
END; { StrReadln }
PROCEDURE StrEmpty (var ioString : tString);
VAR i : integer;
BEGIN
for i:= 1 to MAXSTRLEN do
ioString[i]:= ' '
END; { StrEmpty }
PROCEDURE StrWrite (inString : tString);
VAR i,e : integer;
BEGIN
e:= MAXSTRLEN;
WHILE (inString[e] = chr(32)) and (e >= 1) DO
e:= e-1;
FOR i:= 1 TO e DO
write(inString[i])
END; { StrWrite }
PROCEDURE StrWriteln (inString : tString);
BEGIN
strWrite(inString);
writeln
END; { StrWriteln }
FUNCTION StrLen (inString : tString) : integer;
VAR i : integer;
BEGIN
i:= MAXSTRLEN;
WHILE (inString[i] = chr(32)) and (i >= 1) DO
i:= i-1;
strLen:= i
END; { StrLen }
FUNCTION StrComp (inStringA,inStringB : tString) : boolean;
VAR i : integer;
equal : boolean;
BEGIN
i:= 1;
REPEAT
equal:= (inStringA[i] = inStringB[i]);
i:= i+1
UNTIL (not equal) or (i > MAXSTRLEN);
strComp:= equal
END; { StrComp }
{ ************************************************************
A N A L I Z I N G - P R O C E D U R E S
{ ************************************************************}
PROCEDURE Error;
BEGIN
writeln('error');
halt
END; { Error }
PROCEDURE GetSym;
BEGIN
REPEAT
read(inFile,ch);
{
write(ch);
}
{
IF EOLN(inFile) THEN
begin
writeln;
end
}
UNTIL (ch > ' ');
END; { GetSym }
PROCEDURE Production;
PROCEDURE Identifier;
VAR i : integer;
BEGIN
StrEmpty(symbol);
i:= 1;
WHILE ch in LOWER+UPPER DO
BEGIN
symbol[i]:= ch;
i:= i+1;
GetSym
END;
write('IDENTIFIER: '); StrWriteLn(symbol);
END; { Identifier }
PROCEDURE Literal;
VAR i : integer;
BEGIN
StrEmpty(symbol);
i:= 1;
WHILE ch <> '"' DO
BEGIN
symbol[i]:= ch;
i:= i+1;
GetSym
END;
write('LITERAL: '); StrWriteLn(symbol);
END; { Literal }
PROCEDURE Expression;
PROCEDURE Term;
PROCEDURE Factor;
BEGIN { Factor }
IF ch in UPPER+LOWER THEN { Non-Terminal Symbol }
Identifier
ELSE IF ch = '"' THEN { Terminal Symbol }
BEGIN
GetSym;
Literal;
IF ch = '"' THEN GetSym
ELSE Error
END
ELSE IF ch = '(' THEN
BEGIN
GetSym;
Expression;
IF ch = ')' THEN GetSym
ELSE Error
END
ELSE IF ch = '[' THEN
BEGIN
GetSym;
Expression;
IF ch = ']' THEN GetSym
ELSE Error
END
ELSE IF ch = '{' THEN
BEGIN
GetSym;
Expression;
IF ch = '}' THEN GetSym
ELSE Error
END
ELSE Error
END; { Factor }
BEGIN { Term }
Factor;
WHILE (ch in UPPER+LOWER) or
(ch = '"') or (ch = '(') or
(ch = '[') or (ch = '{') DO
Factor
END; { Term }
BEGIN { Expression }
Term;
WHILE ch = '|' DO
BEGIN
GetSym;
Term
END
END; { Expression }
BEGIN { Production }
Identifier;
IF ch = '=' THEN GetSym
ELSE error;
Expression;
IF ch = '.' THEN GetSym
ELSE error
END; { Production }
{ ************************************************************
P R O G R A M
************************************************************}
BEGIN
assign(inFile,'ebnf');
reset(inFile);
GetSym;
WHILE ch <> '.' DO
Production;
writeln;
END.
