pl/x 语言语法分析器的java实现

类别:Java 点击:0 评论:0 推荐:

/**
 *   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.

本文地址:http://com.8s8s.com/it/it12169.htm