前几天做了语法分析器,,,最近才有时间发表出来

总共有四个包,12个类,

common包主要是公用的变量和公用类:

Enum(是枚举类型的类)

Error(表示错误的类)

Node(词法token节点)

Predict(predict集的数据结构)

SNLPredict(SNL的predict集)

production(产生式的数据结构)

SNLproduction(SNL的产生式集)

treeNode(语法树节点的数据结构)

lex包是用于词法分析的:

scanner(词法分析器)

main包就不解释了

parser包是用于语法分析的:

Parser(语法分析器)

drawTree(画树)

接下来就是代码了:

Enum.java

package common;public interface Enum {public enum lexType{/* 簿记单词符号 */ENDFILE,   ERROR,/* 保留字 */PROGRAM,  PROCEDURE,     TYPE,           VAR,         IF,THEN,        ELSE,          FI,             WHILE,       DO,ENDWH,       BEGIN,         END,            READ,        WRITE,ARRAY,        OF,            RECORD,         RETURN, INTEGER,     CHAR,/* 多字符单词符号 */ID,           INTC,          CHARC,/*特殊符号 */ASSIGN,       EQ,            LT,             PLUS,        MINUS,TIMES,        OVER,          LPAREN,         RPAREN,      DOT,COLON,      SEMI,          COMMA,          LMIDPAREN,   RMIDPAREN,UNDERANGE ; }/*非终极符*/public enum nonTerminals{Program,     ProgramHead,   ProgramName,    DeclarePart, TypeDecpart,TypeDec,     TypeDecList,   TypeDecMore,    TypeId,      TypeDef,BaseType,    StructureType, ArrayType,      Low,         Top,RecType,     FieldDecList,  FieldDecMore,   IdList,      IdMore,VarDecpart,  VarDec,        VarDecList,     VarDecMore,  VarIdList,   VarIdMore,ProcDecpart, ProcDec,       ProcDecMore,    ProcName,    ParamList,   ProcDeclaration ,ParamDecList,ParamMore,     Param,          FormList,    FidMore,ProcDecPart, ProcBody,      ProgramBody,    StmList,     StmMore,     Stm,AssCall,     AssignmentRest,ConditionalStm, LoopStm,     InputStm,Invar,       OutputStm,     ReturnStm,      CallStmRest, ActParamList,ActParamMore,RelExp,        OtherRelE,      Exp,         OtherTerm,Term,        OtherFactor,   Factor,         Variable,    VariMore,    FieldVar,FieldVarMore,CmpOp,         AddOp,          MultOp ;}public enum nodeKind {ProK ,  PheadK , TypeK , VarK , ProcDecK , StmLK , DecK , StmtK , ExpL ;}public enum decKind {ArrayK , CharK , IntegerK , RecordK , IdK ;}public enum stmtKind {IfK , WhileK , AssignK , ReadK , WriteK , CallK , ReturnK ;}public enum expKind {OpK , ConstK , VariK ; }public enum varKind {IdV , ArrayMembV , FieldMembV ;}public enum expType {Void , Integer , Boolean ;}public enum paramType {ValParamType , VarparamType ; }
}

Error.java:

package common;public class Error {static int  Line ;static int Row;static int  ErrorType  ;static boolean  Flag ;public Error(){Line = 0 ; Row  = 0 ;ErrorType = 0 ; Flag = false ;}public static void printError() {if( ErrorType == 1 ) System.out.print( "词法错误" ) ; else if( ErrorType == 2 ) System.out.print( "语法错误" ) ;System.out.println( "  行:" + Line + "  列: " + Row  ) ; }public static void setLine( int line ) {Line = line ; }public static void setRow( int row ) {Row = row ; }public static void setErrorType( int type ) {ErrorType = type ;}public static void setFlag( boolean flag ) {Flag = flag ; }public static int getLine() {return Line ;}public static int getRow()  {return Row  ;}public static int getErrorType() {return ErrorType ;}public static boolean getFlag() {return Flag ; }public static void setError( int line , int row , int type ) {Line = line ; Row  = row  ;ErrorType = type ;Flag = true    ;}
}

Node.java:

package common;import common.Enum.*;public class Node {String Data ;int    Line , Row ;lexType    type ;public Node(){}public String getData() {return Data;}public void setData(String data) {Data = data;}public int getLine() {return Line;}public void setLine(int line) {Line = line;}public int getRow() {return Row;}public void setRow(int row) {Row = row;}public lexType getType() {return type;}public void setType(lexType integer) {this.type = integer;}
}

predict.java:

package common;public class Predict {int         predictNum ;Enum.lexType[] predict = new Enum.lexType[20] ;public Predict() {predictNum = 0 ; }public void setPredict( Enum.lexType pre ) {predict[predictNum] = pre ;predictNum ++ ;}public int getPredictNum() {return predictNum ;}public Enum.lexType getPredict( int number ) {return predict[number] ;}
}

SNLPredict:

package common;public class SNLpredict {public Predict[] predict = new Predict[105] ;public SNLpredict() {for( int i = 0 ; i <= 104 ; i ++ )predict[i] = new Predict() ;predict[1].setPredict( Enum.lexType.PROGRAM ) ;predict[2].setPredict( Enum.lexType.PROGRAM ) ;predict[3].setPredict( Enum.lexType.ID ) ;predict[4].setPredict( Enum.lexType.TYPE ) ;            predict[4].setPredict( Enum.lexType.VAR ) ;predict[4].setPredict( Enum.lexType.PROCEDURE ) ;        predict[4].setPredict( Enum.lexType.BEGIN ) ;predict[5].setPredict( Enum.lexType.VAR ) ;                predict[5].setPredict( Enum.lexType.PROCEDURE ) ;predict[5].setPredict( Enum.lexType.BEGIN ) ;predict[6].setPredict( Enum.lexType.TYPE ) ;predict[7].setPredict( Enum.lexType.TYPE ) ;predict[8].setPredict( Enum.lexType.ID ) ;predict[9].setPredict( Enum.lexType.VAR ) ;             predict[9].setPredict( Enum.lexType.PROCEDURE ) ;predict[9].setPredict( Enum.lexType.BEGIN ) ;predict[10].setPredict( Enum.lexType.ID ) ;predict[11].setPredict( Enum.lexType.ID ) ;predict[12].setPredict( Enum.lexType.INTEGER ) ;        predict[12].setPredict( Enum.lexType.CHAR ) ;predict[13].setPredict( Enum.lexType.ARRAY ) ;         predict[13].setPredict( Enum.lexType.RECORD ) ;predict[14].setPredict( Enum.lexType.ID ) ;predict[15].setPredict( Enum.lexType.INTEGER ) ;predict[16].setPredict( Enum.lexType.CHAR ) ;predict[17].setPredict( Enum.lexType.ARRAY ) ;predict[18].setPredict( Enum.lexType.RECORD ) ;predict[19].setPredict( Enum.lexType.ARRAY ) ;predict[20].setPredict( Enum.lexType.INTC ) ;predict[21].setPredict( Enum.lexType.INTC ) ;predict[22].setPredict( Enum.lexType.RECORD ) ;predict[23].setPredict( Enum.lexType.INTEGER ) ;         predict[23].setPredict( Enum.lexType.CHAR ) ;predict[24].setPredict( Enum.lexType.ARRAY ) ;predict[25].setPredict( Enum.lexType.END ) ;predict[26].setPredict( Enum.lexType.INTEGER ) ;     predict[26].setPredict( Enum.lexType.CHAR ) ;predict[26].setPredict( Enum.lexType.ARRAY ) ;predict[27].setPredict( Enum.lexType.ID ) ;predict[28].setPredict( Enum.lexType.SEMI ) ;predict[29].setPredict( Enum.lexType.COMMA ) ;predict[30].setPredict( Enum.lexType.PROCEDURE ) ;         predict[30].setPredict( Enum.lexType.BEGIN ) ;predict[31].setPredict( Enum.lexType.VAR ) ;predict[32].setPredict( Enum.lexType.VAR ) ;predict[33].setPredict( Enum.lexType.INTEGER ) ;      predict[33].setPredict( Enum.lexType.CHAR ) ;predict[33].setPredict( Enum.lexType.ARRAY ) ;         predict[33].setPredict( Enum.lexType.RECORD ) ;predict[33].setPredict( Enum.lexType.ID ) ;predict[34].setPredict( Enum.lexType.PROCEDURE ) ;        predict[34].setPredict( Enum.lexType.BEGIN ) ;predict[35].setPredict( Enum.lexType.INTEGER ) ;      predict[35].setPredict( Enum.lexType.CHAR ) ;predict[35].setPredict( Enum.lexType.ARRAY ) ;         predict[35].setPredict( Enum.lexType.RECORD ) ;predict[35].setPredict( Enum.lexType.ID ) ;predict[36].setPredict( Enum.lexType.ID ) ;predict[37].setPredict( Enum.lexType.SEMI ) ;predict[38].setPredict( Enum.lexType.COMMA ) ;predict[39].setPredict( Enum.lexType.BEGIN ) ;predict[40].setPredict( Enum.lexType.PROCEDURE ) ;predict[41].setPredict( Enum.lexType.PROCEDURE ) ;predict[42].setPredict( Enum.lexType.BEGIN ) ;predict[43].setPredict( Enum.lexType.PROCEDURE ) ;predict[44].setPredict( Enum.lexType.ID ) ;predict[45].setPredict( Enum.lexType.RPAREN ) ;predict[46].setPredict( Enum.lexType.INTEGER ) ;        predict[46].setPredict( Enum.lexType.CHAR ) ;predict[46].setPredict( Enum.lexType.ARRAY ) ;         predict[46].setPredict( Enum.lexType.RECORD ) ;predict[46].setPredict( Enum.lexType.ID  ) ;             predict[46].setPredict( Enum.lexType.VAR ) ;predict[47].setPredict( Enum.lexType.INTEGER ) ;        predict[47].setPredict( Enum.lexType.CHAR ) ;predict[47].setPredict( Enum.lexType.ARRAY ) ;         predict[47].setPredict( Enum.lexType.RECORD ) ;predict[47].setPredict( Enum.lexType.ID  ) ;             predict[47].setPredict( Enum.lexType.VAR ) ;predict[48].setPredict( Enum.lexType.RPAREN ) ;predict[49].setPredict( Enum.lexType.SEMI ) ;predict[50].setPredict( Enum.lexType.INTEGER ) ;        predict[50].setPredict( Enum.lexType.CHAR ) ;predict[50].setPredict( Enum.lexType.ARRAY ) ;         predict[50].setPredict( Enum.lexType.RECORD ) ;predict[50].setPredict( Enum.lexType.ID ) ;predict[51].setPredict( Enum.lexType.VAR ) ;predict[52].setPredict( Enum.lexType.ID ) ;predict[53].setPredict( Enum.lexType.SEMI ) ;          predict[53].setPredict( Enum.lexType.RPAREN ) ;predict[54].setPredict( Enum.lexType.COMMA ) ;predict[55].setPredict( Enum.lexType.TYPE ) ;          predict[55].setPredict( Enum.lexType.VAR ) ;predict[55].setPredict( Enum.lexType.PROCEDURE ) ;      predict[55].setPredict( Enum.lexType.BEGIN ) ;predict[56].setPredict( Enum.lexType.BEGIN ) ;predict[57].setPredict( Enum.lexType.BEGIN ) ;predict[58].setPredict( Enum.lexType.ID ) ;               predict[58].setPredict( Enum.lexType.IF ) ;predict[58].setPredict( Enum.lexType.WHILE ) ;           predict[58].setPredict( Enum.lexType.RETURN ) ;predict[58].setPredict( Enum.lexType.READ ) ;            predict[58].setPredict( Enum.lexType.WRITE ) ;predict[58].setPredict( Enum.lexType.END ) ;          predict[58].setPredict( Enum.lexType.SEMI ) ;predict[59].setPredict( Enum.lexType.ELSE ) ;          predict[59].setPredict( Enum.lexType.FI ) ;predict[59].setPredict( Enum.lexType.END ) ;         predict[59].setPredict( Enum.lexType.ENDWH ) ;predict[60].setPredict( Enum.lexType.SEMI ) ; predict[61].setPredict( Enum.lexType.IF ) ;predict[62].setPredict( Enum.lexType.WHILE ) ;predict[63].setPredict( Enum.lexType.READ ) ;predict[64].setPredict( Enum.lexType.WRITE ) ;predict[65].setPredict( Enum.lexType.RETURN ) ;predict[66].setPredict( Enum.lexType.ID ) ;predict[67].setPredict( Enum.lexType.ASSIGN ) ;           predict[67].setPredict( Enum.lexType.DOT ) ;predict[67].setPredict( Enum.lexType.LMIDPAREN ) ;predict[68].setPredict( Enum.lexType.LPAREN ) ;predict[69].setPredict( Enum.lexType.LMIDPAREN ) ;     predict[69].setPredict( Enum.lexType.DOT ) ;predict[69].setPredict( Enum.lexType.ASSIGN ) ;predict[70].setPredict( Enum.lexType.IF ) ;predict[71].setPredict( Enum.lexType.WHILE ) ;predict[72].setPredict( Enum.lexType.READ ) ;predict[73].setPredict( Enum.lexType.ID ) ;predict[74].setPredict( Enum.lexType.WRITE ) ;predict[75].setPredict( Enum.lexType.RETURN ) ;predict[76].setPredict( Enum.lexType.LPAREN ) ;predict[77].setPredict( Enum.lexType.RPAREN ) ;predict[78].setPredict( Enum.lexType.LPAREN ) ;          predict[78].setPredict( Enum.lexType.INTC ) ;predict[78].setPredict( Enum.lexType.ID ) ;predict[79].setPredict( Enum.lexType.RPAREN ) ;predict[80].setPredict( Enum.lexType.COMMA ) ;predict[81].setPredict( Enum.lexType.LPAREN ) ;            predict[81].setPredict( Enum.lexType.INTC ) ;predict[81].setPredict( Enum.lexType.ID ) ;predict[82].setPredict( Enum.lexType.LT ) ;             predict[82].setPredict( Enum.lexType.EQ ) ;predict[83].setPredict( Enum.lexType.LPAREN ) ;          predict[83].setPredict( Enum.lexType.INTC ) ;predict[83].setPredict( Enum.lexType.ID ) ;predict[84].setPredict( Enum.lexType.LT ) ;             predict[84].setPredict( Enum.lexType.EQ ) ;predict[84].setPredict( Enum.lexType.RMIDPAREN ) ;       predict[84].setPredict( Enum.lexType.THEN ) ;predict[84].setPredict( Enum.lexType.ELSE ) ;          predict[84].setPredict( Enum.lexType.FI ) ;predict[84].setPredict( Enum.lexType.DO ) ;              predict[84].setPredict( Enum.lexType.ENDWH ) ;predict[84].setPredict( Enum.lexType.RPAREN ) ;           predict[84].setPredict( Enum.lexType.END ) ;predict[84].setPredict( Enum.lexType.SEMI ) ;           predict[84].setPredict( Enum.lexType.COMMA ) ;predict[85].setPredict( Enum.lexType.PLUS ) ;         predict[85].setPredict( Enum.lexType.MINUS ) ;predict[86].setPredict( Enum.lexType.LPAREN ) ;           predict[86].setPredict( Enum.lexType.INTC ) ;predict[86].setPredict( Enum.lexType.ID ) ;predict[87].setPredict( Enum.lexType.PLUS ) ;           predict[87].setPredict( Enum.lexType.MINUS ) ;predict[87].setPredict( Enum.lexType.LT ) ;               predict[87].setPredict( Enum.lexType.EQ ) ;predict[87].setPredict( Enum.lexType.RMIDPAREN ) ;       predict[87].setPredict( Enum.lexType.THEN ) ;predict[87].setPredict( Enum.lexType.ELSE ) ;          predict[87].setPredict( Enum.lexType.FI ) ;predict[87].setPredict( Enum.lexType.DO ) ;              predict[87].setPredict( Enum.lexType.ENDWH ) ;predict[87].setPredict( Enum.lexType.RPAREN ) ;           predict[87].setPredict( Enum.lexType.END ) ;predict[87].setPredict( Enum.lexType.SEMI ) ;           predict[87].setPredict( Enum.lexType.COMMA ) ;predict[88].setPredict( Enum.lexType.TIMES ) ;            predict[88].setPredict( Enum.lexType.OVER ) ;predict[89].setPredict( Enum.lexType.LPAREN ) ;        predict[90].setPredict( Enum.lexType.INTC ) ;predict[91].setPredict( Enum.lexType.ID ) ;predict[92].setPredict( Enum.lexType.ID ) ;predict[93].setPredict( Enum.lexType.ASSIGN ) ;          predict[93].setPredict( Enum.lexType.TIMES ) ;predict[93].setPredict( Enum.lexType.OVER ) ;         predict[93].setPredict( Enum.lexType.PLUS ) ;predict[93].setPredict( Enum.lexType.MINUS ) ;         predict[93].setPredict( Enum.lexType.LT ) ;predict[93].setPredict( Enum.lexType.EQ ) ;              predict[93].setPredict( Enum.lexType.THEN ) ;predict[93].setPredict( Enum.lexType.ELSE ) ;          predict[93].setPredict( Enum.lexType.FI ) ;predict[93].setPredict( Enum.lexType.DO ) ;              predict[93].setPredict( Enum.lexType.ENDWH ) ;predict[93].setPredict( Enum.lexType.RPAREN ) ;           predict[93].setPredict( Enum.lexType.END ) ;predict[93].setPredict( Enum.lexType.SEMI ) ;           predict[93].setPredict( Enum.lexType.COMMA ) ;predict[93].setPredict( Enum.lexType.RMIDPAREN ) ;predict[94].setPredict( Enum.lexType.LMIDPAREN ) ;predict[95].setPredict( Enum.lexType.DOT ) ;predict[96].setPredict( Enum.lexType.ID ) ;predict[97].setPredict( Enum.lexType.ASSIGN ) ;            predict[97].setPredict( Enum.lexType.TIMES ) ;predict[97].setPredict( Enum.lexType.OVER ) ;         predict[97].setPredict( Enum.lexType.PLUS ) ;predict[97].setPredict( Enum.lexType.MINUS ) ;         predict[97].setPredict( Enum.lexType.LT ) ;predict[97].setPredict( Enum.lexType.EQ ) ;              predict[97].setPredict( Enum.lexType.THEN ) ;predict[97].setPredict( Enum.lexType.ELSE ) ;          predict[97].setPredict( Enum.lexType.FI ) ;predict[97].setPredict( Enum.lexType.DO ) ;              predict[97].setPredict( Enum.lexType.ENDWH ) ;predict[97].setPredict( Enum.lexType.RPAREN ) ;           predict[97].setPredict( Enum.lexType.END ) ;predict[97].setPredict( Enum.lexType.SEMI ) ;           predict[97].setPredict( Enum.lexType.COMMA ) ;predict[97].setPredict( Enum.lexType.RMIDPAREN ) ;predict[98].setPredict( Enum.lexType.LMIDPAREN ) ;predict[99].setPredict( Enum.lexType.LT ) ;predict[100].setPredict( Enum.lexType.EQ ) ;predict[101].setPredict( Enum.lexType.PLUS ) ;predict[102].setPredict( Enum.lexType.MINUS ) ;predict[103].setPredict( Enum.lexType.TIMES ) ;predict[104].setPredict( Enum.lexType.OVER ) ;}
}

production.java:

package common;public class Production {Enum.nonTerminals Head ;int productNum ; class product {public int flag ;                 // 0表示终极符,1表示非终极符public Enum.nonTerminals nonterminals ;public Enum.lexType      terminals    ;}product[] Product = new product[10] ;public Production(){productNum = 0 ; }public void setHead( Enum.nonTerminals head ) {Head = head ;}public void setProduction( Enum.nonTerminals nonterminal ){Product[productNum] = new product() ;Product[productNum].flag = 1 ;Product[productNum].nonterminals = nonterminal ; productNum ++ ; }public void setProduction( Enum.lexType  terminal ){Product[productNum] = new product() ; Product[productNum].flag = 0 ;Product[productNum].terminals = terminal ;productNum ++ ;}public Enum.nonTerminals getHead(){return Head ;}public int getproductNum() {return productNum ;}public int getflag( int number ) {if( Product[number].flag == 1 ) return 1 ;else return 0 ;}public Enum.nonTerminals getProductNonterminal( int number ) {return Product[number].nonterminals ;}public Enum.lexType getProductTerminal( int number ) {return Product[number].terminals ;}
} ;

SNLProduction.java:

package common;public class SNLproduct {public Production[] product = new Production[105] ;public SNLproduct() {for( int i = 0 ; i <= 104 ; i ++ )product[i] = new Production() ;product[1].setHead( Enum.nonTerminals.Program ) ;              product[1].setProduction( Enum.nonTerminals.ProgramHead ) ;product[1].setProduction( Enum.nonTerminals.DeclarePart ) ;      product[1].setProduction( Enum.nonTerminals.ProgramBody ) ;product[2].setHead( Enum.nonTerminals.ProgramHead ) ;            product[2].setProduction( Enum.lexType.PROGRAM ) ;product[2].setProduction( Enum.nonTerminals.ProgramName ) ;product[3].setHead( Enum.nonTerminals.ProgramName ) ;          product[3].setProduction( Enum.lexType.ID ) ;product[4].setHead( Enum.nonTerminals.DeclarePart ) ;          product[4].setProduction( Enum.nonTerminals.TypeDecpart ) ;product[4].setProduction( Enum.nonTerminals.VarDecpart ) ;      product[4].setProduction( Enum.nonTerminals.ProcDecpart ) ;product[5].setHead( Enum.nonTerminals.TypeDecpart ) ;product[6].setHead( Enum.nonTerminals.TypeDecpart ) ;            product[6].setProduction( Enum.nonTerminals.TypeDec ) ;product[7].setHead( Enum.nonTerminals.TypeDec ) ;                product[7].setProduction( Enum.lexType.TYPE ) ;product[7].setProduction( Enum.nonTerminals.TypeDecList ) ;product[8].setHead( Enum.nonTerminals.TypeDecList ) ;         product[8].setProduction( Enum.nonTerminals.TypeId ) ;product[8].setProduction( Enum.lexType.EQ ) ;                 product[8].setProduction( Enum.nonTerminals.TypeDef ) ;product[8].setProduction( Enum.lexType.SEMI ) ;                  product[8].setProduction( Enum.nonTerminals.TypeDecMore ) ;product[9].setHead( Enum.nonTerminals.TypeDecMore ) ;            product[10].setHead( Enum.nonTerminals.TypeDecMore ) ;          product[10].setProduction( Enum.nonTerminals.TypeDecList ) ;product[11].setHead( Enum.nonTerminals.TypeId ) ;               product[11].setProduction( Enum.lexType.ID ) ;product[12].setHead( Enum.nonTerminals.TypeDef ) ;                product[12].setProduction( Enum.nonTerminals.BaseType ) ;product[13].setHead( Enum.nonTerminals.TypeDef ) ;             product[13].setProduction( Enum.nonTerminals.StructureType ) ;product[14].setHead( Enum.nonTerminals.TypeDef ) ;                product[14].setProduction( Enum.lexType.ID ) ;product[15].setHead( Enum.nonTerminals.BaseType ) ;               product[15].setProduction( Enum.lexType.INTEGER ) ;product[16].setHead( Enum.nonTerminals.BaseType ) ;              product[16].setProduction( Enum.lexType.CHAR ) ;product[17].setHead( Enum.nonTerminals.StructureType ) ;        product[17].setProduction( Enum.nonTerminals.ArrayType ) ;product[18].setHead( Enum.nonTerminals.StructureType ) ;      product[18].setProduction( Enum.nonTerminals.RecType ) ;product[19].setHead( Enum.nonTerminals.ArrayType ) ;            product[19].setProduction( Enum.lexType.ARRAY ) ;product[19].setProduction( Enum.lexType.LMIDPAREN ) ;          product[19].setProduction( Enum.nonTerminals.Low ) ;product[19].setProduction( Enum.lexType.UNDERANGE ) ;           product[19].setProduction( Enum.nonTerminals.Top ) ;product[19].setProduction( Enum.lexType.RMIDPAREN ) ;           product[19].setProduction( Enum.lexType.OF ) ;                  product[19].setProduction( Enum.nonTerminals.BaseType ) ;product[20].setHead( Enum.nonTerminals.Low ) ;                 product[20].setProduction( Enum.lexType.INTC ) ;product[21].setHead( Enum.nonTerminals.Top ) ;                  product[21].setProduction( Enum.lexType.INTC ) ;product[22].setHead( Enum.nonTerminals.RecType ) ;              product[22].setProduction( Enum.lexType.RECORD ) ;product[22].setProduction( Enum.nonTerminals.FieldDecList ) ; product[22].setProduction( Enum.lexType.END ) ;product[23].setHead( Enum.nonTerminals.FieldDecList ) ;          product[23].setProduction( Enum.nonTerminals.BaseType ) ;product[23].setProduction( Enum.nonTerminals.IdList ) ;            product[23].setProduction( Enum.lexType.SEMI ) ;product[23].setProduction( Enum.nonTerminals.FieldDecMore ) ;product[24].setHead( Enum.nonTerminals.FieldDecList ) ;            product[24].setProduction( Enum.nonTerminals.ArrayType ) ;product[24].setProduction( Enum.nonTerminals.IdList ) ;           product[24].setProduction( Enum.lexType.SEMI ) ;product[24].setProduction( Enum.nonTerminals.FieldDecMore ) ;product[25].setHead( Enum.nonTerminals.FieldDecMore ) ;product[26].setHead( Enum.nonTerminals.FieldDecMore ) ;         product[26].setProduction( Enum.nonTerminals.FieldDecList ) ;product[27].setHead( Enum.nonTerminals.IdList ) ;              product[27].setProduction( Enum.lexType.ID ) ;product[27].setProduction( Enum.nonTerminals.IdMore ) ;product[28].setHead( Enum.nonTerminals.IdMore ) ;product[29].setHead( Enum.nonTerminals.IdMore ) ;             product[29].setProduction( Enum.lexType.COMMA ) ;product[29].setProduction( Enum.nonTerminals.IdList ) ;product[30].setHead( Enum.nonTerminals.VarDecpart ) ;product[31].setHead( Enum.nonTerminals.VarDecpart ) ;          product[31].setProduction( Enum.nonTerminals.VarDec ) ;product[32].setHead( Enum.nonTerminals.VarDec ) ;                product[32].setProduction( Enum.lexType.VAR ) ;product[32].setProduction( Enum.nonTerminals.VarDecList ) ;product[33].setHead( Enum.nonTerminals.VarDecList ) ;         product[33].setProduction( Enum.nonTerminals.TypeDef ) ;product[33].setProduction( Enum.nonTerminals.VarIdList ) ;      product[33].setProduction( Enum.lexType.SEMI ) ;product[33].setProduction( Enum.nonTerminals.VarDecMore ) ;product[34].setHead( Enum.nonTerminals.VarDecMore ) ;product[35].setHead( Enum.nonTerminals.VarDecMore ) ;           product[35].setProduction( Enum.nonTerminals.VarDecList ) ;product[36].setHead( Enum.nonTerminals.VarIdList ) ;         product[36].setProduction( Enum.lexType.ID ) ;product[36].setProduction( Enum.nonTerminals.VarIdMore ) ;product[37].setHead( Enum.nonTerminals.VarIdMore ) ;product[38].setHead( Enum.nonTerminals.VarIdMore ) ;            product[38].setProduction( Enum.lexType.COMMA ) ;product[38].setProduction( Enum.nonTerminals.VarIdList ) ;product[39].setHead( Enum.nonTerminals.ProcDecpart ) ;           product[40].setHead( Enum.nonTerminals.ProcDecpart ) ;          product[40].setProduction( Enum.nonTerminals.ProcDec ) ;product[41].setHead( Enum.nonTerminals.ProcDec ) ;              product[41].setProduction( Enum.lexType.PROCEDURE ) ;product[41].setProduction( Enum.nonTerminals.ProcName ) ;      product[41].setProduction( Enum.lexType.LPAREN ) ;product[41].setProduction( Enum.nonTerminals.ParamList ) ;        product[41].setProduction( Enum.lexType.RPAREN ) ;product[41].setProduction( Enum.lexType.SEMI ) ;              product[41].setProduction( Enum.nonTerminals.ProcDecPart ) ;product[41].setProduction( Enum.nonTerminals.ProcBody ) ;       product[41].setProduction( Enum.nonTerminals.ProcDecMore ) ;product[42].setHead( Enum.nonTerminals.ProcDecMore ) ;product[43].setHead( Enum.nonTerminals.ProcDecMore ) ;            product[43].setProduction( Enum.nonTerminals.ProcDec ) ;product[44].setHead( Enum.nonTerminals.ProcName ) ;             product[44].setProduction( Enum.lexType.ID ) ;product[45].setHead( Enum.nonTerminals.ParamList ) ;          product[46].setHead( Enum.nonTerminals.ParamList ) ;            product[46].setProduction( Enum.nonTerminals.ParamDecList ) ;product[47].setHead( Enum.nonTerminals.ParamDecList ) ;            product[47].setProduction( Enum.nonTerminals.Param ) ;product[47].setProduction( Enum.nonTerminals.ParamMore ) ;product[48].setHead( Enum.nonTerminals.ParamMore ) ;product[49].setHead( Enum.nonTerminals.ParamMore ) ;            product[49].setProduction( Enum.lexType.SEMI ) ;product[49].setProduction( Enum.nonTerminals.ParamDecList ) ;product[50].setHead( Enum.nonTerminals.Param ) ;               product[50].setProduction( Enum.nonTerminals.TypeDef ) ;product[50].setProduction( Enum.nonTerminals.FormList ) ;product[51].setHead( Enum.nonTerminals.Param ) ;               product[51].setProduction( Enum.lexType.VAR ) ;product[51].setProduction( Enum.nonTerminals.TypeDef ) ;     product[51].setProduction( Enum.nonTerminals.FormList ) ;product[52].setHead( Enum.nonTerminals.FormList ) ;                product[52].setProduction( Enum.lexType.ID ) ;product[52].setProduction( Enum.nonTerminals.FidMore ) ;product[53].setHead( Enum.nonTerminals.FidMore ) ;product[54].setHead( Enum.nonTerminals.FidMore ) ;              product[54].setProduction( Enum.lexType.COMMA ) ;product[54].setProduction( Enum.nonTerminals.FormList ) ;product[55].setHead( Enum.nonTerminals.ProcDecPart ) ;            product[55].setProduction( Enum.nonTerminals.DeclarePart ) ;product[56].setHead( Enum.nonTerminals.ProcBody ) ;             product[56].setProduction( Enum.nonTerminals.ProgramBody ) ;product[57].setHead( Enum.nonTerminals.ProgramBody ) ;          product[57].setProduction( Enum.lexType.BEGIN ) ;product[57].setProduction( Enum.nonTerminals.StmList ) ;       product[57].setProduction( Enum.lexType.END ) ;product[58].setHead( Enum.nonTerminals.StmList ) ;               product[58].setProduction( Enum.nonTerminals.Stm ) ;product[58].setProduction( Enum.nonTerminals.StmMore ) ;product[59].setHead( Enum.nonTerminals.StmMore ) ;product[60].setHead( Enum.nonTerminals.StmMore ) ;                product[60].setProduction( Enum.lexType.SEMI ) ;product[60].setProduction( Enum.nonTerminals.StmList ) ;product[61].setHead( Enum.nonTerminals.Stm ) ;                  product[61].setProduction( Enum.nonTerminals.ConditionalStm ) ;product[62].setHead( Enum.nonTerminals.Stm ) ;                   product[62].setProduction( Enum.nonTerminals.LoopStm ) ;product[63].setHead( Enum.nonTerminals.Stm ) ;                  product[63].setProduction( Enum.nonTerminals.InputStm ) ;product[64].setHead( Enum.nonTerminals.Stm ) ;                 product[64].setProduction( Enum.nonTerminals.OutputStm ) ;product[65].setHead( Enum.nonTerminals.Stm ) ;                    product[65].setProduction( Enum.nonTerminals.ReturnStm ) ;product[66].setHead( Enum.nonTerminals.Stm ) ;                    product[66].setProduction( Enum.lexType.ID ) ;product[66].setProduction( Enum.nonTerminals.AssCall ) ;product[67].setHead( Enum.nonTerminals.AssCall );             product[67].setProduction( Enum.nonTerminals.AssignmentRest ) ;product[68].setHead( Enum.nonTerminals.AssCall ) ;               product[68].setProduction( Enum.nonTerminals.CallStmRest ) ;product[69].setHead( Enum.nonTerminals.AssignmentRest ) ;       product[69].setProduction( Enum.nonTerminals.VariMore ) ; product[69].setProduction( Enum.lexType.ASSIGN ) ;                product[69].setProduction( Enum.nonTerminals.Exp ) ;product[70].setHead( Enum.nonTerminals.ConditionalStm ) ;       product[70].setProduction( Enum.lexType.IF ) ;product[70].setProduction( Enum.nonTerminals.RelExp ) ;       product[70].setProduction( Enum.lexType.THEN ) ; product[70].setProduction( Enum.nonTerminals.StmList ) ;       product[70].setProduction( Enum.lexType.ELSE ) ;product[70].setProduction( Enum.nonTerminals.StmList ) ;        product[70].setProduction( Enum.lexType.FI ) ;product[71].setHead( Enum.nonTerminals.LoopStm ) ;                product[71].setProduction( Enum.lexType.WHILE ) ;product[71].setProduction( Enum.nonTerminals.RelExp ) ;            product[71].setProduction( Enum.lexType.DO ) ;product[71].setProduction( Enum.nonTerminals.StmList ) ;      product[71].setProduction( Enum.lexType.ENDWH ) ;product[72].setHead( Enum.nonTerminals.InputStm ) ;                product[72].setProduction( Enum.lexType.READ ) ;product[72].setProduction( Enum.lexType.LPAREN ) ;              product[72].setProduction( Enum.nonTerminals.Invar ) ;product[72].setProduction( Enum.lexType.RPAREN ) ;product[73].setHead( Enum.nonTerminals.Invar ) ;                product[73].setProduction( Enum.lexType.ID ) ;product[74].setHead( Enum.nonTerminals.OutputStm ) ;          product[74].setProduction( Enum.lexType.WRITE ) ;product[74].setProduction( Enum.lexType.LPAREN ) ;             product[74].setProduction( Enum.nonTerminals.Exp ) ;product[74].setProduction( Enum.lexType.RPAREN ) ;product[75].setHead( Enum.nonTerminals.ReturnStm ) ;          product[75].setProduction( Enum.lexType.RETURN ) ;product[76].setHead( Enum.nonTerminals.CallStmRest ) ;            product[76].setProduction( Enum.lexType.LPAREN );product[76].setProduction( Enum.nonTerminals.ActParamList ) ;  product[76].setProduction( Enum.lexType.RPAREN ) ;product[77].setHead( Enum.nonTerminals.ActParamList ) ;   product[78].setHead( Enum.nonTerminals.ActParamList ) ;         product[78].setProduction( Enum.nonTerminals.Exp ) ;product[78].setProduction( Enum.nonTerminals.ActParamMore ) ;product[79].setHead( Enum.nonTerminals.ActParamMore ) ;    product[80].setHead( Enum.nonTerminals.ActParamMore ) ;         product[80].setProduction( Enum.lexType.COMMA ) ;product[80].setProduction( Enum.nonTerminals.ActParamList ) ;product[81].setHead( Enum.nonTerminals.RelExp ) ;             product[81].setProduction( Enum.nonTerminals.Exp ) ;product[81].setProduction( Enum.nonTerminals.OtherRelE ) ;product[82].setHead( Enum.nonTerminals.OtherRelE ) ;          product[82].setProduction( Enum.nonTerminals.CmpOp ) ;product[82].setProduction( Enum.nonTerminals.Exp ) ;product[83].setHead( Enum.nonTerminals.Exp ) ;                    product[83].setProduction( Enum.nonTerminals.Term ) ;product[83].setProduction( Enum.nonTerminals.OtherTerm ) ;product[84].setHead( Enum.nonTerminals.OtherTerm ) ;         product[85].setHead( Enum.nonTerminals.OtherTerm ) ;            product[85].setProduction( Enum.nonTerminals.AddOp ) ;product[85].setProduction( Enum.nonTerminals.Exp ) ;product[86].setHead( Enum.nonTerminals.Term ) ;                   product[86].setProduction( Enum.nonTerminals.Factor ) ;product[86].setProduction( Enum.nonTerminals.OtherFactor ) ;product[87].setHead( Enum.nonTerminals.OtherFactor ) ;           product[88].setHead( Enum.nonTerminals.OtherFactor ) ;          product[88].setProduction( Enum.nonTerminals.MultOp ) ;product[88].setProduction( Enum.nonTerminals.Term ) ;product[89].setHead( Enum.nonTerminals.Factor ) ;               product[89].setProduction( Enum.lexType.LPAREN ) ;product[89].setProduction( Enum.nonTerminals.Exp ) ;          product[89].setProduction( Enum.lexType.RPAREN ) ;product[90].setHead( Enum.nonTerminals.Factor ) ;             product[90].setProduction( Enum.lexType.INTC ) ;product[91].setHead( Enum.nonTerminals.Factor ) ;               product[91].setProduction( Enum.nonTerminals.Variable ) ;product[92].setHead( Enum.nonTerminals.Variable ) ;                product[92].setProduction( Enum.lexType.ID ) ;product[92].setProduction( Enum.nonTerminals.VariMore ) ;product[93].setHead( Enum.nonTerminals.VariMore ) ;  product[94].setHead( Enum.nonTerminals.VariMore ) ;             product[94].setProduction( Enum.lexType.LMIDPAREN ) ;product[94].setProduction( Enum.nonTerminals.Exp ) ;           product[94].setProduction( Enum.lexType.RMIDPAREN ) ;product[95].setHead( Enum.nonTerminals.VariMore ) ;                product[95].setProduction( Enum.lexType.DOT ) ;product[95].setProduction( Enum.nonTerminals.FieldVar ) ;product[96].setHead( Enum.nonTerminals.FieldVar ) ;             product[96].setProduction( Enum.lexType.ID ) ;product[96].setProduction( Enum.nonTerminals.FieldVarMore ) ;product[97].setHead( Enum.nonTerminals.FieldVarMore ) ;product[98].setHead( Enum.nonTerminals.FieldVarMore ) ;           product[98].setProduction( Enum.lexType.LMIDPAREN ) ;product[98].setProduction( Enum.nonTerminals.Exp ) ;           product[98].setProduction( Enum.lexType.RMIDPAREN ) ;product[99].setHead( Enum.nonTerminals.CmpOp ) ;               product[99].setProduction( Enum.lexType.LT ) ;product[100].setHead( Enum.nonTerminals.CmpOp ) ;             product[100].setProduction( Enum.lexType.EQ ) ;product[101].setHead( Enum.nonTerminals.AddOp ) ;                product[101].setProduction( Enum.lexType.PLUS ) ;product[102].setHead( Enum.nonTerminals.AddOp ) ;              product[102].setProduction( Enum.lexType.MINUS ) ;product[103].setHead( Enum.nonTerminals.MultOp ) ;                product[103].setProduction( Enum.lexType.TIMES ) ;product[104].setHead( Enum.nonTerminals.MultOp ) ;                product[104].setProduction( Enum.lexType.OVER ) ;}
}

treeNode.java:

package common;public  class treeNode {int childNum ; treeNode[] child = new treeNode[10] ; treeNode father ;int flag ;     // 0 表示叶子节点Enum.nonTerminals NonTerminal ;Enum.lexType Terminal ;String data ;int x , y , width , length ;public treeNode() {childNum = 0 ;}public void setChild( treeNode node ) {child[childNum] = new treeNode() ;child[childNum] = node ;childNum ++ ;}public void setFather( treeNode node ) {father = new treeNode() ;father = node ;}public void setflag( int FLAG ) {flag = FLAG ;}public void setData( String DATA ) {data = DATA ; }public void setNonTerminal( Enum.nonTerminals nonTerminal ) {NonTerminal = nonTerminal ;}public void setTerminal( Enum.lexType terminal ) {Terminal = terminal ;}public int getchildNum() {return childNum ;}public treeNode getChild( int num ) {return child[num] ;}public treeNode getFather() {return father ;}public int getflag() {return flag ; }public Enum.nonTerminals getNonTerminal() {return NonTerminal ; }public Enum.lexType getTerminal() {return Terminal ; }public String getData() {return data ; }public void setX( int X ) {x = X ;}public int  getX() {return x ;}public void setY( int Y ) {y = Y ;}public int  getY() {return y ; }public void setWidth( int Width ) {width = Width ;}public int  getWidth() {return width ;}public void setLength( int Length ) {length = Length ;}public int  getLength() {return length ;}}

scanner.java:

/**********************/
/* auther:    lishicao*/
/* date  :    2013.3.7*/
/* lexical analyzer   */
/**********************/package lex;import java.io.*    ;
import common.Enum  ;
import common.Enum.lexType;
import common.Node  ;
import common.Error ;
import java.util.*  ;public class scanner {static int line , row , cur ;static String Buffer ;//public static Error error = new Error() ;public scanner() {line = 1 ; row = 1 ; cur = 0 ; }/************************************//*传入文件地址(string),读入源文件,返回string *//*       功能是将源文件读入Buffer中                             *//************************************/public static String readTxt( String filePath ) throws Exception {FileReader file = new FileReader( filePath ) ;BufferedReader reader = new BufferedReader( file ) ;String temp = "" ;while( reader.ready() ) {temp += reader.readLine() ;temp += '\n' ;}return temp ;}/************************************//*  取得下一个非空字符,并将该字符的下标赋值给cur  *//*          如果到了文件结束返回‘\0’       *//************************************/public static char getNextChar() {int   i  ;char  ch = '\0' ;if( cur == Buffer.length() - 1 ) {ch = '\0' ;return ch ; }for( i = cur ; i < Buffer.length() ; i ++ ) {if( Buffer.charAt( i ) == '\n' ) {line ++ ;row = 1 ;}else if( Buffer.charAt( i ) == ' ' ) row ++ ;else if( Buffer.charAt( i ) == '\t' ) row += 4 ;else break ;}if( i != Buffer.length() ) {ch = Buffer.charAt( i ) ;}else ch = '\0' ;cur = i ;return ch ;}/***********************************//*             识别数字                                                 *//***********************************/public static String isNumber( char ch ){String res = "" ;int  temp = cur ; while( Buffer.charAt( temp ) >= '0' && Buffer.charAt( temp ) <= '9' ){res += Buffer.charAt( temp ) ; temp ++ ;row  ++ ;}if( ( Buffer.charAt( temp ) >= 'a' && Buffer.charAt( temp ) <= 'z' ) || ( Buffer.charAt( temp ) >= 'A' && Buffer.charAt( temp ) <= 'Z' ) )res = null ;cur = temp ;return res ; }/***********************************//*         识别标示符或者保留字                                    *//***********************************/public static String isName( char ch ){String res = "" ;int  temp = cur ; while( ( Buffer.charAt( temp ) >= '0' && Buffer.charAt( temp ) <= '9' ) || ( Buffer.charAt( temp ) >= 'a' && Buffer.charAt( temp ) <= 'z' ) || ( Buffer.charAt( temp ) >= 'A' && Buffer.charAt( temp ) <= 'Z' ) ) {res += Buffer.charAt( temp ) ;temp ++ ;row  ++ ;}cur = temp ;return res ;}/***********************************//*          识别具体是哪个保留字         *//***********************************/public static lexType recognizeName( String name ){switch( name ) {case "program"   : return Enum.lexType.PROGRAM   ;case "type"      : return Enum.lexType.TYPE      ;case "var"       : return Enum.lexType.VAR       ;case "procedure" : return Enum.lexType.PROCEDURE ;case "begin"     : return Enum.lexType.BEGIN     ;case "end"        : return Enum.lexType.END       ;case "array"     : return Enum.lexType.ARRAY     ;case "of"        : return Enum.lexType.OF        ; case "record"    : return Enum.lexType.RECORD    ;case "if"       : return Enum.lexType.IF        ;case "then"      : return Enum.lexType.THEN      ; case "else"         : return Enum.lexType.ELSE      ;case "fi"        : return Enum.lexType.FI        ;case "while"     : return Enum.lexType.WHILE     ;case "do"        : return Enum.lexType.DO        ; case "endwh"    : return Enum.lexType.ENDWH     ;case "read"      : return Enum.lexType.READ      ; case "write"    : return Enum.lexType.WRITE     ; case "return"   : return Enum.lexType.RETURN    ;case "integer"   : return Enum.lexType.INTEGER   ; case "char"         : return Enum.lexType.CHAR      ;default          : return Enum.lexType.ID      ;      } }/***********************************//*        识别该字符具体是哪个符号                                  *//***********************************/public static lexType recognizeSymbol( char symbol ) {switch( symbol ) {case '+'       : return Enum.lexType.PLUS      ; case '-'        : return Enum.lexType.MINUS     ; case '*'        : return Enum.lexType.TIMES     ;case '/'         : return Enum.lexType.OVER      ;case '('         : return Enum.lexType.LPAREN    ; case ')'        : return Enum.lexType.RPAREN    ;case '.'         : return Enum.lexType.DOT       ; case '['        : return Enum.lexType.LMIDPAREN ;case ']'         : return Enum.lexType.RMIDPAREN ; case ';'        : return Enum.lexType.SEMI      ; case ':'        : return Enum.lexType.COLON     ; case ','        : return Enum.lexType.COMMA     ; case '<'         : return Enum.lexType.LT        ; case '='       : return Enum.lexType.EQ        ; case '\''      : return Enum.lexType.CHARC     ;case '\0'        : return Enum.lexType.ENDFILE   ;}return null ;}/************************************//*         得到下一个 token             *//************************************/public static Node getNextToken() {Node now = new Node() ;char c ;c = getNextChar() ;if( c == '\0' ) return null ;now.setLine( line ) ;now.setRow(  row  ) ;if( c >= '0' && c <= '9' ){String temp = isNumber( c ) ;if( temp != null ) {now.setData( temp ) ;now.setType( Enum.lexType.INTC ) ;}else {now = null ;Error.setError( line , row , 1 ) ;}}else if( ( c >= 'a' && c<= 'z' ) || ( c >= 'A' && c <= 'Z' ) ){String temp = isName( c ) ;if( temp != null ) now.setData( temp ) ;else now = null ;now.setType( recognizeName( temp ) ) ;}else if( c == '{' ) {int  i ;int  num = 1 ;for( i = cur + 1 ; i < Buffer.length() ; i ++ ) {if( Buffer.charAt( i ) == '{' ) num ++ ;else if( Buffer.charAt( i ) == '}' ) num -- ;if( Buffer.charAt( i ) == '\n' ) {line ++ ;row = 1 ;}else if( Buffer.charAt( i ) == '\t' ) row += 4 ;else row ++ ;if( num == 0 ) break ;}if( num != 0 ) {cur = i ; Error.setError( line , row , 1 ) ;}else cur = i + 1 ;now.setData( null ) ;}else{if( c == ':' && Buffer.charAt( cur + 1 ) == '=' ) {now.setData( ":=" ) ;now.setType( Enum.lexType.ASSIGN ) ;cur += 2 ; row += 2 ;}else if( c == '.' && Buffer.charAt( cur + 1 ) == '.' ) {now.setData( ".." ) ;now.setType( Enum.lexType.UNDERANGE ) ;cur += 2 ; row += 2 ; }else {String temp = new String() ;temp += c ;now.setType( recognizeSymbol( c ) ) ;now.setData( temp ) ;if( now.getType() == null ) {Error.setError( line , row , 1) ;}cur ++ ; row ++ ;}}return now ;}/************************************//*        用String传入源文件地址                                  *//*        返回一个链表,就是token链                             *//************************************/public ArrayList< Node > getTokenList( String filePath ) throws Exception {Buffer = readTxt( filePath ) ;ArrayList< Node > TokenList = new ArrayList < Node > () ;while( true ) {Node temp = new Node () ;temp = getNextToken() ;if( temp == null ){Node tmp = new Node() ;tmp.setType( lexType.ENDFILE ) ;tmp.setLine( line + 1 ) ;tmp.setRow( 0 ) ;TokenList.add( tmp ) ;break ;}if( temp.getData() == null ) continue ; if( Error.getFlag() ) break ; TokenList.add( temp ) ;}return TokenList ;}}

Parser.java:

package parser;import java.util.*;import  lex.scanner  ;
import  common.* ;
import  common.Enum  ;
import  common.Error ;public class Parser {static SNLproduct Product = new SNLproduct() ;static SNLpredict Predict = new SNLpredict() ;static scanner Scanner = new scanner() ;static ArrayList < Node > TokenList = new ArrayList< Node > () ;static int cur ;public Parser() {cur = 0 ; }/*****************//*递归地匹配一个非终极符*//*****************/public static treeNode match( Enum.nonTerminals NonTerminal , treeNode father ) {int  i , j , choose = -1 ;treeNode root = new treeNode() ;Enum.nonTerminals temp ;Enum.lexType curLex = TokenList.get(cur).getType() ;root.setflag( 1 ) ;root.setNonTerminal( NonTerminal ) ;root.setFather( father ) ;for( i = 1 ; i <= 104 ; i ++ ) {int flag = 0 ; temp = Product.product[i].getHead() ;for( j = 0 ; j < Predict.predict[i].getPredictNum() ; j ++ ) {if( curLex == Predict.predict[i].getPredict( j ) ) {flag = 1 ; break ;}}if(  flag == 1 && temp == NonTerminal ) {choose = i ; break ;}}if( choose == -1 ) {Error.setError( TokenList.get(cur).getLine() , TokenList.get(cur).getRow() , 2 ) ;return null ;}else {for( i = 0 ; i < Product.product[choose].getproductNum() ; i ++ ) {if( Product.product[choose].getflag( i ) == 0 ) {treeNode leaf = new treeNode() ;leaf.setFather( father ) ;leaf.setflag( 0 ) ;leaf.setTerminal( Product.product[choose].getProductTerminal( i ) ) ;leaf.setData( TokenList.get( cur ).getData() ) ;root.setChild( leaf ) ;cur ++ ;}else {treeNode child ;Enum.nonTerminals NonTerminals = Product.product[choose].getProductNonterminal(i) ;child = match( NonTerminals , root ) ;root.setChild( child ) ;}}}return root ; }/*********************//*得到一个语法分析树,返回树根*//*********************/public static treeNode getTree( String filePath ) throws Exception {TokenList = Scanner.getTokenList( filePath ) ;if( Error.getFlag() == true ) {return null ;}else {treeNode root = new treeNode() ;cur = 0 ;root = match( Enum.nonTerminals.Program , root ) ;if( TokenList.get(cur).getType() != Enum.lexType.ENDFILE ){Error.setError( TokenList.get(cur).getLine() , TokenList.get(cur).getRow() , 2 ) ;}if( Error.getFlag() == true ) {Error.printError() ;return null ;}return root ; }}
}

drawTree.java:

package parser;import common.treeNode;
import javax.swing.* ;import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics ;public class drawTree extends JFrame {static int  X ;static int  Space = 30 ;static int  Width , High ;static NewPanel Panel ;public static void main( String[] args ) throws Exception {treeNode root = new treeNode() ;   Parser parser = new Parser() ;root = parser.getTree( "source.txt" ) ;drawtree( root ) ;}public  drawTree() {Panel = new NewPanel() ;Panel.setPreferredSize( new Dimension( Width , High ) ) ;JScrollPane pane = new JScrollPane( Panel );add( pane ) ;}public  static int getTreeInf( treeNode root , int Y ) {int  temp , Length , width = 0 ;          String str = "" ;if( root.getflag() == 0 || ( root.getchildNum() == 0 ) ) {if( root.getflag() == 0 ) str += root.getData() ;else str += root.getNonTerminal() ;Length = str.length() * 8 ;width = Length + Space ;root.setLength( Length ) ;root.setWidth( width ) ;root.setX( X ) ;root.setY( Y ) ;X += width ;}else {str += root.getNonTerminal() ;Length = str.length() * 8 ;root.setLength( Length ) ;root.setY( Y ) ;temp = X ;for( int i = 0 ; i < root.getchildNum() ; i ++ ) {width += getTreeInf( root.getChild( i ) , Y + 150 ) ;}root.setX( temp + width / 2 - Length / 2 ) ;if( width < Length ) {width = Length / 2 + width / 2 ;X += Length - width + Space ;}root.setWidth( width ) ;}return width ;}public  static void drawtree( treeNode root ) {X = 20 ;High = getTreeInf( root , 20 ) ;Width = X ;Panel.Root = root ;drawTree frame = new drawTree() ;frame.setTitle( "语法分析树" ) ;frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ) ;frame.setSize( 800 , 600 ) ;frame.setVisible( true ) ;}
}class NewPanel extends JLabel {public static treeNode Root ;public void draw( treeNode root , Graphics g ) {g.drawRect( root.getX() - 3 , root.getY() - 15 , root.getLength() + 1 , 20 ) ;if( root.getflag() == 0 ) {g.drawString( root.getData() , root.getX() , root.getY() ) ;}else {g.drawString( "" + root.getNonTerminal() , root.getX() , root.getY() ) ;if( root.getchildNum() != 0 ) {for( int i = 0 ; i < root.getchildNum() ; i ++ ) {g.drawLine( root.getX() + root.getLength() / 2 , root.getY() + 5  , root.getChild(i).getX() + root.getChild(i).getLength() / 2 , root.getChild(i).getY() - 15 ) ;draw( root.getChild( i ) , g ) ;}}}}public void paint( Graphics g ) {super.paint( g ) ;g.setColor( Color.white ) ;g.fillRect(0, 0, this.getWidth(), this.getHeight());g.setColor( Color.black ) ;draw( Root , g ) ;}
}

==  好冗长的代码

SNL语法分析器以及语法树的绘画相关推荐

  1. Java中语法分析器_语法分析器(java语法分析器)

    亲这是一款采用递归下降语法分析器,是一种适合手写语法编译器的方法,且非常简单.递归下降法对语言所用的文法有一些限制,但递归下降是现阶段主流的语法分析方法,因为它可以由开发人员高度控制,在提供错误信息方 ...

  2. java语法分析_语法分析器(java语法分析器)

    亲这是一款采用递归下降语法分析器,是一种适合手写语法编译器的方法,且非常简单.递归下降法对语言所用的文法有一些限制,但递归下降是现阶段主流的语法分析方法,因为它可以由开发人员高度控制,在提供错误信息方 ...

  3. java实现语法分析器_200 行 JS 代码,带你实现代码编译器

    一.前言 对于前端同学来说,编译器可能适合神奇的魔盒 ,表面普通,但常常给我们惊喜. 编译器,顾名思义,用来编译,编译什么呢?当然是编译代码咯 . 其实我们也经常接触到编译器的使用场景: React ...

  4. Vczh Library++ 语法分析器开发指南

    Vczh Library++ 语法分析器开发指南 陈梓瀚 前言 在日常的开发工作中我们总是时不时需要写一些语法分析器.语法分析器不一定指的是一门语言的编译器前端,也有可能仅仅是一个自己设计格式的配置文 ...

  5. 【编译原理】LR语法分析器的设计与实现

    LR语法分析器的设计与实现 本文为当时编译原理实验作业,要求用设计的思想完成,小题大做,仅供参考 文章目录 LR语法分析器的设计与实现 实验要求 实现功能 输入输出 样例 一.LR语法分析器问题定义 ...

  6. 编译器之语法分析器(syntax analyzer)

    语法分析器根据语法将标记流(来自词法分析器)转换为语法树. 任务描述 从"词法分析器" 中获取输出,并根据以下语法将其转换为抽象语法树(AST).输出应为扁平格式. 程序应从文件和 ...

  7. 自制编译器:语法分析器(二)

    这篇博文拖了好久才写完,其一是语法分析器本身的难度实在有点超出我的预料,以至于反复重构多次才完成,其二是因为弄了个xbox玩,占用了一部分的课余时间= =!. 本篇博文将分为以下几个部分来描述一下语法 ...

  8. java实现语法分析器_语法分析 | 语法分析的任务

    在之前,我们有对编译器做过一定的介绍,我们认为编译器是具有一定流水线结构的软件系统.它可以分为前端,中端和后端这样的不同的阶段. 编译器前端 对于我们正在研究的前端,我们已经通过词法分析的学习掌握了从 ...

  9. 递归下降语法分析器的构建_一文了解函数式查询优化器Spark SQL Catalyst

    大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 暴走大数据点击右侧关注,暴走大数据!记录一下个人对sparkSql的catalyst这个函数式的可扩展的查询优化器的理解,目录如下: 0. O ...

最新文章

  1. gitter 卸载_最佳Gitter频道:Scala
  2. 独家 | 请停止使用浏览器过程中的不安全行为(附链接)
  3. Power Designer的使用
  4. js实现HTML标题栏中新消息提示效果
  5. 牛客题霸 [ 求二叉树的层序遍历] C++题解/答案
  6. 小废物在我面前痛不欲生……(图)
  7. 异速联:解决打印样式个性化设置
  8. 从认知动机理论看设计:如何读懂用户?
  9. 第五课多元函数偏导与全微分
  10. 概率论复习笔记一——伯努利实验及相关的概率分布
  11. 英语中学生测试软件,初中生免费学英语的软件哪个好
  12. Class Fxp\Composer\AssetPlugin\Repository\NpmRepository does not exist
  13. Strom和Trident
  14. 恶劣的仿造文化:从meebo到米博
  15. 用C语言打印一个金字塔
  16. springboot 利用aop实现系统日志和操作日志记录
  17. Android学习-指南针(方向传感器)
  18. 详解vue-element-admin 使用mock.js动态模拟数据
  19. JS获取当前时间戳与时间戳转日期时间格式
  20. python爬取分析超级大乐透历史开奖数据

热门文章

  1. js apply()用法详解
  2. ubuntu 使用阿里云镜像源快速搭建kubernetes 1.15.2集群
  3. C# .Net Framework、.Net Core和.Net Standard的区别
  4. 主机服务器信息控制台,服务器进程很多控制台主机
  5. java sonar教程_Sonar 插件
  6. (1)动态磁盘技术 (2)建立基本卷、带区卷、跨区卷、镜像卷和RAID-5卷的方法 (3)磁盘配额...
  7. Oracle executeBatch异常 ArrayIndexOutOfBoundsException
  8. 工商管理学计算机应用基础题,计算机应用基础全国网考选择题库(计算机基础知识篇).pdf...
  9. 一个芯片从构想到完成电路设计的过程是怎样的?
  10. 入门JAVA第六天 面向对象