private List <symbol_reserved> reservedSym = new List <symbol_reserved>(); //保留字表 /// <summary> /// 构造函数 /// </summary> public SymbolAnalysis(PL0Compiler C) { ch = (int)' '; LSymLine = 1; lineNum = 1; compiler = C; sourceCode = new StreamReader(compiler.source); //添加保留词 reservedSym.Add(new symbol_reserved(symbol.beginSym, "begin")); reservedSym.Add(new symbol_reserved(symbol.endSym, "end")); reservedSym.Add(new symbol_reserved(symbol.constSym, "const")); reservedSym.Add(new symbol_reserved(symbol.varSym, "var")); reservedSym.Add(new symbol_reserved(symbol.procedureSym, "procedure")); reservedSym.Add(new symbol_reserved(symbol.oddSym, "odd")); reservedSym.Add(new symbol_reserved(symbol.ifSym, "if")); reservedSym.Add(new symbol_reserved(symbol.thenSym, "then")); reservedSym.Add(new symbol_reserved(symbol.elseSym, "else")); reservedSym.Add(new symbol_reserved(symbol.callSym, "call")); reservedSym.Add(new symbol_reserved(symbol.whileSym, "while")); reservedSym.Add(new symbol_reserved(symbol.doSym, "do")); reservedSym.Add(new symbol_reserved(symbol.repeatSym, "repeat")); reservedSym.Add(new symbol_reserved(symbol.untilSym, "until")); reservedSym.Add(new symbol_reserved(symbol.readSym, "read")); reservedSym.Add(new symbol_reserved(symbol.writeSym, "write")); }
/// <summary> /// 构造函数 /// </summary> public SymbolTable(PL0Compiler C) { this.lev = 0; this.tx[0] = 0; SymTabItem nul = new SymTabItem(); nul.name = ""; SymTable.Add(nul); this.compiler = C; }
private SymbolSet factorbegs = new SymbolSet(); //因子开始符号集 /// <summary> /// 构造函数 /// </summary> /// <param name="C"></param> public GrammarAndSemanticAna(PL0Compiler C) { compiler = C; //添加声明部分开始符号 declarebegs.Add(symbol.constSym); declarebegs.Add(symbol.varSym); declarebegs.Add(symbol.procedureSym); //添加语句开始符号 statementbegs.Add(symbol.beginSym); statementbegs.Add(symbol.callSym); statementbegs.Add(symbol.whileSym); statementbegs.Add(symbol.ifSym); statementbegs.Add(symbol.repeatSym); //添加因子开始符号 factorbegs.Add(symbol.ident); factorbegs.Add(symbol.number); factorbegs.Add(symbol.LParenthesis); }
/// <summary> /// 构造函数 /// </summary> public ErrorHandle(PL0Compiler C) { compiler = C; //添加错误 errors.Add(1, "常数说明中的\"=\"写成\":=\""); errors.Add(2, "常数说明中的\"=\"后应是数字"); errors.Add(3, "常数说明中标识符后应是\"=\""); errors.Add(4, "const, var, procedure 后应是标识符"); errors.Add(5, "漏掉了\',\' 或\';\'"); errors.Add(6, "过程说明后的符号不正确(应是语句开始符,或过程定义符"); errors.Add(7, "应是语句开始符"); errors.Add(8, "程序体内的语句部分的后跟符不正确"); errors.Add(9, "程序结尾丢了句号\'.\'"); errors.Add(10, "语句之间漏了\';\'"); errors.Add(11, "标识符未说明"); errors.Add(12, "赋值语句中, 赋值号左部标识符属性应是变量"); errors.Add(13, "赋值语句左部标识符后应是赋值号\':=\'"); errors.Add(14, "call 后应为标识符"); errors.Add(15, "call 后标识符属性应为过程"); errors.Add(16, "条件语句中丢了\'then\'"); errors.Add(17, "丢了\'end\' 或\';\'"); errors.Add(18, "while 型循环语句中丢了\'do\'"); errors.Add(19, "语句后的符号不正确"); errors.Add(20, "应为关系运算符"); errors.Add(21, "表达式内标识符属性不能是过程"); errors.Add(22, "表达式中漏掉右括号\')\'"); errors.Add(23, "因子后的非法符号"); errors.Add(24, "表达式的开始符不能是此符号"); errors.Add(25, "repeat 型循环语句中没有until"); errors.Add(26, "程序层次结构超过限制"); errors.Add(30, "数位太长"); errors.Add(31, "数越界"); errors.Add(32, "read语句括号中的标识符不是变量"); errors.Add(33, "语句漏掉左括号\'(\'"); errors.Add(34, "语句漏掉右括号\')\'"); errors.Add(35, "read语句缺乏变量"); errors.Add(36, "程序体之外出现字符"); }