313 lines
14 KiB
Modula-2
313 lines
14 KiB
Modula-2
MODULE Compiler;
|
|
|
|
FROM Terminal IMPORT WriteString, WriteLn;
|
|
|
|
TYPE
|
|
(*
|
|
Classification table assigns each possible character to a group (class). All
|
|
characters of the same group a handled equivalently.
|
|
|
|
Classification:
|
|
*)
|
|
TransitionClass = (
|
|
transitionClassInvalid,
|
|
transitionClassDigit,
|
|
transitionClassCharacter,
|
|
transitionClassSpace,
|
|
transitionClassColon,
|
|
transitionClassEquals,
|
|
transitionClassLeftParen,
|
|
transitionClassRightParen,
|
|
transitionClassAsterisk,
|
|
transitionClassUnderscore,
|
|
transitionClassSingle,
|
|
transitionClassHex,
|
|
transitionClassZero,
|
|
transitionClassX,
|
|
transitionClassEof,
|
|
transitionClassDot,
|
|
transitionClassMinus,
|
|
transitionClassQuote,
|
|
transitionClassGreater,
|
|
transitionClassLess,
|
|
transitionClassOther
|
|
);
|
|
TransitionState = (
|
|
transitionStateStart,
|
|
transitionStateColon,
|
|
transitionStateIdentifier,
|
|
transitionStateDecimal,
|
|
transitionStateGreater,
|
|
transitionStateMinus,
|
|
transitionStateLeftParen,
|
|
transitionStateLess,
|
|
transitionStateHexadecimal,
|
|
transitionStateComment,
|
|
transitionStateClosingComment,
|
|
transitionStateString,
|
|
transitionStateLeadingZero,
|
|
transitionStateHexadecimalPrefix,
|
|
transitionStateEnd
|
|
);
|
|
Transition = RECORD
|
|
Action: PROCEDURE();
|
|
NextState: TransitionState
|
|
END;
|
|
|
|
VAR
|
|
Classification: ARRAY[1..128] OF TransitionClass;
|
|
Transitions: ARRAY[0..MAX(TransitionState)] OF ARRAY[0..MAX(TransitionClass)] OF Transition;
|
|
|
|
PROCEDURE InitializeClassification();
|
|
BEGIN
|
|
Classification[1] := transitionClassEof; (* NUL *)
|
|
Classification[2] := transitionClassInvalid; (* SOH *)
|
|
Classification[3] := transitionClassInvalid; (* STX *)
|
|
Classification[4] := transitionClassInvalid; (* ETX *)
|
|
Classification[5] := transitionClassInvalid; (* EOT *)
|
|
Classification[6] := transitionClassInvalid; (* EMQ *)
|
|
Classification[7] := transitionClassInvalid; (* ACK *)
|
|
Classification[8] := transitionClassInvalid; (* BEL *)
|
|
Classification[9] := transitionClassInvalid; (* BS *)
|
|
Classification[10] := transitionClassSpace; (* HT *)
|
|
Classification[11] := transitionClassSpace; (* LF *)
|
|
Classification[12] := transitionClassInvalid; (* VT *)
|
|
Classification[13] := transitionClassInvalid; (* FF *)
|
|
Classification[14] := transitionClassSpace; (* CR *)
|
|
Classification[15] := transitionClassInvalid; (* SO *)
|
|
Classification[16] := transitionClassInvalid; (* SI *)
|
|
Classification[17] := transitionClassInvalid; (* DLE *)
|
|
Classification[18] := transitionClassInvalid; (* DC1 *)
|
|
Classification[19] := transitionClassInvalid; (* DC2 *)
|
|
Classification[20] := transitionClassInvalid; (* DC3 *)
|
|
Classification[21] := transitionClassInvalid; (* DC4 *)
|
|
Classification[22] := transitionClassInvalid; (* NAK *)
|
|
Classification[23] := transitionClassInvalid; (* SYN *)
|
|
Classification[24] := transitionClassInvalid; (* ETB *)
|
|
Classification[25] := transitionClassInvalid; (* CAN *)
|
|
Classification[26] := transitionClassInvalid; (* EM *)
|
|
Classification[27] := transitionClassInvalid; (* SUB *)
|
|
Classification[28] := transitionClassInvalid; (* ESC *)
|
|
Classification[29] := transitionClassInvalid; (* FS *)
|
|
Classification[30] := transitionClassInvalid; (* GS *)
|
|
Classification[31] := transitionClassInvalid; (* RS *)
|
|
Classification[32] := transitionClassInvalid; (* US *)
|
|
Classification[33] := transitionClassSpace; (* Space *)
|
|
Classification[34] := transitionClassSingle; (* ! *)
|
|
Classification[35] := transitionClassQuote; (* " *)
|
|
Classification[36] := transitionClassOther; (* # *)
|
|
Classification[37] := transitionClassOther; (* $ *)
|
|
Classification[38] := transitionClassSingle; (* % *)
|
|
Classification[39] := transitionClassSingle; (* & *)
|
|
Classification[40] := transitionClassQuote; (* ' *)
|
|
Classification[41] := transitionClassLeftParen; (* ( *)
|
|
Classification[42] := transitionClassRightParen; (* ) *)
|
|
Classification[43] := transitionClassAsterisk; (* * *)
|
|
Classification[44] := transitionClassSingle; (* + *)
|
|
Classification[45] := transitionClassSingle; (* , *)
|
|
Classification[46] := transitionClassMinus; (* - *)
|
|
Classification[47] := transitionClassDot; (* . *)
|
|
Classification[48] := transitionClassSingle; (* / *)
|
|
Classification[49] := transitionClassZero; (* 0 *)
|
|
Classification[50] := transitionClassDigit; (* 1 *)
|
|
Classification[51] := transitionClassDigit; (* 2 *)
|
|
Classification[52] := transitionClassDigit; (* 3 *)
|
|
Classification[53] := transitionClassDigit; (* 4 *)
|
|
Classification[54] := transitionClassDigit; (* 5 *)
|
|
Classification[55] := transitionClassDigit; (* 6 *)
|
|
Classification[56] := transitionClassDigit; (* 7 *)
|
|
Classification[57] := transitionClassDigit; (* 8 *)
|
|
Classification[58] := transitionClassDigit; (* 9 *)
|
|
Classification[59] := transitionClassColon; (* : *)
|
|
Classification[60] := transitionClassSingle; (* ; *)
|
|
Classification[61] := transitionClassLess; (* < *)
|
|
Classification[62] := transitionClassEquals; (* = *)
|
|
Classification[63] := transitionClassGreater; (* > *)
|
|
Classification[64] := transitionClassOther; (* ? *)
|
|
Classification[65] := transitionClassSingle; (* @ *)
|
|
Classification[66] := transitionClassCharacter; (* A *)
|
|
Classification[67] := transitionClassCharacter; (* B *)
|
|
Classification[68] := transitionClassCharacter; (* C *)
|
|
Classification[69] := transitionClassCharacter; (* D *)
|
|
Classification[70] := transitionClassCharacter; (* E *)
|
|
Classification[71] := transitionClassCharacter; (* F *)
|
|
Classification[72] := transitionClassCharacter; (* G *)
|
|
Classification[73] := transitionClassCharacter; (* H *)
|
|
Classification[74] := transitionClassCharacter; (* I *)
|
|
Classification[75] := transitionClassCharacter; (* J *)
|
|
Classification[76] := transitionClassCharacter; (* K *)
|
|
Classification[77] := transitionClassCharacter; (* L *)
|
|
Classification[78] := transitionClassCharacter; (* M *)
|
|
Classification[79] := transitionClassCharacter; (* N *)
|
|
Classification[80] := transitionClassCharacter; (* O *)
|
|
Classification[81] := transitionClassCharacter; (* P *)
|
|
Classification[82] := transitionClassCharacter; (* Q *)
|
|
Classification[83] := transitionClassCharacter; (* R *)
|
|
Classification[84] := transitionClassCharacter; (* S *)
|
|
Classification[85] := transitionClassCharacter; (* T *)
|
|
Classification[86] := transitionClassCharacter; (* U *)
|
|
Classification[67] := transitionClassCharacter; (* V *)
|
|
Classification[88] := transitionClassCharacter; (* W *)
|
|
Classification[89] := transitionClassCharacter; (* X *)
|
|
Classification[90] := transitionClassCharacter; (* Y *)
|
|
Classification[91] := transitionClassCharacter; (* Z *)
|
|
Classification[92] := transitionClassSingle; (* [ *)
|
|
Classification[93] := transitionClassOther; (* \ *)
|
|
Classification[94] := transitionClassSingle; (* ] *)
|
|
Classification[95] := transitionClassSingle; (* ^ *)
|
|
Classification[96] := transitionClassUnderscore; (* _ *)
|
|
Classification[97] := transitionClassOther; (* ` *)
|
|
Classification[98] := transitionClassHex; (* a *)
|
|
Classification[99] := transitionClassHex; (* b *)
|
|
Classification[100] := transitionClassHex; (* c *)
|
|
Classification[101] := transitionClassHex; (* d *)
|
|
Classification[102] := transitionClassHex; (* e *)
|
|
Classification[103] := transitionClassHex; (* f *)
|
|
Classification[104] := transitionClassCharacter; (* g *)
|
|
Classification[105] := transitionClassCharacter; (* h *)
|
|
Classification[106] := transitionClassCharacter; (* i *)
|
|
Classification[107] := transitionClassCharacter; (* j *)
|
|
Classification[108] := transitionClassCharacter; (* k *)
|
|
Classification[109] := transitionClassCharacter; (* l *)
|
|
Classification[110] := transitionClassCharacter; (* m *)
|
|
Classification[111] := transitionClassCharacter; (* n *)
|
|
Classification[112] := transitionClassCharacter; (* o *)
|
|
Classification[113] := transitionClassCharacter; (* p *)
|
|
Classification[114] := transitionClassCharacter; (* q *)
|
|
Classification[115] := transitionClassCharacter; (* r *)
|
|
Classification[116] := transitionClassCharacter; (* s *)
|
|
Classification[117] := transitionClassCharacter; (* t *)
|
|
Classification[118] := transitionClassCharacter; (* u *)
|
|
Classification[119] := transitionClassCharacter; (* v *)
|
|
Classification[120] := transitionClassCharacter; (* w *)
|
|
Classification[121] := transitionClassX; (* x *)
|
|
Classification[122] := transitionClassCharacter; (* y *)
|
|
Classification[123] := transitionClassCharacter; (* z *)
|
|
Classification[124] := transitionClassOther; (* { *)
|
|
Classification[125] := transitionClassSingle; (* | *)
|
|
Classification[126] := transitionClassOther; (* } *)
|
|
Classification[127] := transitionClassSingle; (* ~ *)
|
|
Classification[128] := transitionClassInvalid (* DEL *)
|
|
END InitializeClassification;
|
|
|
|
(* 0x00. No action. *)
|
|
PROCEDURE TransitionActionNo();
|
|
BEGIN
|
|
END TransitionActionNo;
|
|
|
|
(* 0x01. Accumulate action. *)
|
|
PROCEDURE TransitionActionAccumulate();
|
|
BEGIN
|
|
END TransitionActionAccumulate;
|
|
|
|
(* 0x02. Print action. *)
|
|
PROCEDURE TransitionActionPrint();
|
|
BEGIN
|
|
END TransitionActionPrint;
|
|
|
|
(* 0x03. Skip action. *)
|
|
PROCEDURE TransitionActionSkip();
|
|
BEGIN
|
|
END TransitionActionSkip;
|
|
|
|
(* 0x04. Delimited string action. *)
|
|
PROCEDURE TransitionActionDelimited();
|
|
BEGIN
|
|
END TransitionActionDelimited;
|
|
|
|
(* 0x05. Finalize identifier action. *)
|
|
PROCEDURE TransitionActionFinalize();
|
|
BEGIN
|
|
END TransitionActionFinalize;
|
|
|
|
(* 0x06. Single character symbol action. *)
|
|
PROCEDURE TransitionActionSingle();
|
|
BEGIN
|
|
END TransitionActionSingle;
|
|
|
|
(* 0x07. An action for symbols containing multiple characters. *)
|
|
PROCEDURE TransitionActionComposite();
|
|
BEGIN
|
|
END TransitionActionComposite;
|
|
|
|
(* 0x08. Integer action. *)
|
|
PROCEDURE TransitionActionInteger();
|
|
BEGIN
|
|
END TransitionActionInteger;
|
|
|
|
PROCEDURE InitializeTransitions();
|
|
BEGIN
|
|
(* Start state. *)
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassInvalid)].Action := TransitionActionNo;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassInvalid)].NextState := transitionStateEnd;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassDigit)].Action := TransitionActionAccumulate;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassDigit)].NextState := transitionStateDecimal;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassCharacter)].Action := TransitionActionAccumulate;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassCharacter)].NextState := transitionStateIdentifier;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassSpace)].Action := TransitionActionSkip;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassSpace)].NextState := transitionStateStart;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassColon)].Action := TransitionActionAccumulate;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassColon)].NextState := transitionStateColon;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassEquals)].Action := TransitionActionSingle;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassEquals)].NextState := transitionStateEnd;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassLeftParen)].Action := TransitionActionAccumulate;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassLeftParen)].NextState := transitionStateLeftParen;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassRightParen)].Action := TransitionActionSingle;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassRightParen)].NextState := transitionStateEnd;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassAsterisk)].Action := TransitionActionSingle;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassAsterisk)].NextState := transitionStateEnd;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassUnderscore)].Action := TransitionActionAccumulate;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassUnderscore)].NextState := transitionStateIdentifier;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassSingle)].Action := TransitionActionSingle;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassSingle)].NextState := transitionStateEnd;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassHex)].Action := TransitionActionAccumulate;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassHex)].NextState := transitionStateIdentifier;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassZero)].Action := TransitionActionAccumulate;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassZero)].NextState := transitionStateLeadingZero;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassX)].Action := TransitionActionAccumulate;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassX)].NextState := transitionStateIdentifier;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassEof)].Action := TransitionActionNo;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassEof)].NextState := transitionStateEnd;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassDot)].Action := TransitionActionSingle;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassDot)].NextState := transitionStateEnd;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassMinus)].Action := TransitionActionAccumulate;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassMinus)].NextState := transitionStateMinus;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassQuote)].Action := TransitionActionAccumulate;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassQuote)].NextState := transitionStateString;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassGreater)].Action := TransitionActionAccumulate;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassGreater)].NextState := transitionStateGreater;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassLess)].Action := TransitionActionAccumulate;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassLess)].NextState := transitionStateLess;
|
|
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassOther)].Action := TransitionActionNo;
|
|
Transitions[ORD(transitionStateStart)][ORD(transitionClassOther)].NextState := transitionStateEnd;
|
|
|
|
END InitializeTransitions;
|
|
|
|
BEGIN
|
|
InitializeClassification();
|
|
InitializeTransitions();
|
|
|
|
WriteString('Elna');
|
|
WriteLn()
|
|
END Compiler.
|