/**  *   pl/x 语言语法分析器的java实现 
  *  ps:这是我的编译作业,只是帖出来一部分,呵呵,大家指正!  * @author 作者:小进 <br>  * 时间:2004年20/12* <hr>  */ package plx; 
public class Parser extends GetSymbol {     GetSymbol sym; 
    int word; 
    public Parser() {         sym = new GetSymbol();     }    /**     * 语法分析开始方法      */     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 == thensym) {                 ss();                 if (word == elsesym) {                     ss();                 } else if (word != endsym) {                     error(9);                 }                 word = sym.getNextSymbol();             } else {                 error(10); //if then 不匹配 
            }             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不匹配             }             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) {         case 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) { //整型变量定义             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) { //逻辑变量定义             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();     } 
}
 
 
  
另附:PL/X语言语法 
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 “then” ss [“else” ss] “end”  
           | “while” be “do” ss “end” | “repeat” ss “until” be | “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 | “(”be”)” | re. 
re=(aident | number) (“=”|”>’|”>=”|”<”|”<=”|”/=”) ae. 
 
 
  |