/ ** * PL / X language syntax analyzer's Java implementation
* Ps: This is my compile job, just a part of the post, huh, huh, everyone corrects! * / Package PLX;
Public class parser extends getsymbol {getsymbol SYM;
Int word;
Public parser () {SYM = new getsymbol ();} / ** * Syntax analysis start method * / public void start () {word = sym.getnextsymbol (); if (word == programsym) {ds (); if (Word == Beginsym) {ss (); if (word == endsym) {Word = sym.getnextsymbol (); if (Word! = period) {Error (7);}} else {Error (6);} } else {
Error (5);}} else {Error (0);}}
Private void ss () {s (); while (word == semicolon) {s ();}}
Private void s () {word = sym.getnextsymbol ();
Switch (Word) {Case Aident: {Word = Sym.getNextSymbol ();
IF (Word == Become) {ae ();
} else {Error (8);} Break;}
Case bident: {word = sym.getnextsymbol (); if (word == Become) {be ();
} else {Error (8);} Break;} case ifsym: {be (); if (word == Tensym) {ss (); if (word == elsesYM) {ss ();} else f (word! = endsym) {Error (9);} word = sym.getnextsymbol ();} else {error (10); // if then does not match} Break;} Case WhileSym: {BE ();
IF (word == dosym) {ss (); if (word == endsym) {Word = sym.getnextsymbol ();} else {Error (11); // end;}} Break;} Case Repeatsym: {SS (); If (word == UntilSym) {be ();} else {error (12); // repeat Until does not match} Break;} Case WriteSym: {AE (); Break;}
}
Private void be () {bt (); while (word == orsym) {bt (); word = sym.getnextsymbol ();
}
/ ** * * / private void bt () {bf (); while (word == andSYM) {bf ();}}
Private void bf () {word = sym.getnextsymbol (); switch (word) {copy bident: {word = sym.getnextsymbol (); Break;}
Case TRUESYM: {
Word = sym.getnextsymbol (); Break;} case falsesym: {word = sym.getnextsymbol (); break;} case notsym: {bf (); break;} case lparen: {be (); if (word! = RPAREN) {Error ();} word = sym.getnextsymbol (); break;} default: re (); break;}}
/ ** * * / private void re () {if ((word == aident) || (word == Number) {
Word = Sym.getNextSymbol (); if (Word == Equal) || (Word == Notequ) || (Word == LEQ) || (Word == GEQ) || (Word == GTR) || (Word == LSS)) {ae ();} else {error (14);}} else {error (13);}}
/ ** * * / private void AE () {word = sym.getnextsymbol (); if (word == minus) {system.out.println ("fdsafsadf"); Word = Sym.getNextSymbol (); at () WHILE ((Word == Minus) || (Word == Plus)) {Word = Sym.getNextSymbol (); at ();}} else {at (); while ((word == minus) | Word == Plus)) {Word = Sym.getNextSymbol (); at ();
}}}
/ ** * * / private void at () {AF (); word = sym.getnextsymbol (); while (word == Times) || (word == slash)) {Word = Sym.getnextSymbol (); AF (); word = sym.getnextsymbol ();}} private void AF () {if (word == Aident) {
} else if (word == Number) {
} else if (word == lparen) {AE (); if (word! = rparen) {Error (15);}} else {Error (16);}}
Private void ds () {d (); while (word == semicolon) {d ();
}
Private void d () {word = sym.getnextsymbol (); if (word == integersym) {// integer variable definition word = sym.getnextsymbol (); if (word == Aident) {Word = Sym.getNextSymbol );
While (Word == Comma) {Word = Sym.getNextSymbol (); if (Word! = AIDENT) {Error (18);} Word = Sym.getNextSymbol ();
} else {
Error (17);}}} else if (word == logicalsym) {// logical variable definition word = sym.getnextsymbol (); if (word == bident) {Word = Sym.getNextSymbol ();
While (Word == Comma) {Word = Sym.getNextSymbol (); if (Word! = BIDENT) {Error (20);} Word = Sym.getNextSymbol ();
} else {Error (19);}}}
Private void error () {system.out.println ("error!");} public static void main (String [] args) {(New Parser ()). start ();}
}
Another attached: PL / X language syntax
PROG = "Program" DS "begin" ss "end" ".".
DS = D {";" D}.
SS = s {"s" s}.
D = "Integer" Aident {"," Aident} | "Logical" Bident {"," BIDENT}.
S = aident ": =" AE | Biednt ": =" be | "if" be "the" SS ["ELSE" SS] "END"
"While" be "do" ss "end" | "repeat" SS "uns" uns "" WRITE "AE.
AE = ["-"] at {("-" | " ") at}.
AT = AF {("*" | "/") AF}.
AF = AIDENT | NUMBER | "(" AE ")".
BE = bt {"or" bt}.
Bt = BF ("AND" BF).
BF = BIDENT | "True" | "false" | "NOT" BF | "" | Re.
RE = ("="> ">"> "<=" | "/ =") AE.