www.mucker.at http://www.mucker.at Helmut Mucker de EBNF-Analysis http://www.mucker.at/2006//09#ebnf_pas Ein Programm zur Syntax Analyse, ähnlich dem in "Niklais Wirth - Compilerbau, Seite 32ff. <br><br> First off all the programs EBNF for feed: <pre> * 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") "'". . </pre> now her's the program: <pre> { ************************************************************ 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. </pre>