?? parser.java
字號:
}
//移動到else里以判斷是否是數組 nextSym();
}
while (sym == Symbol.comma);
}
else {
String ss1 = err.report(34); // 格式錯誤,應是左括號
ss = ss + ss1 + "\n";
}
if (sym == Symbol.rparen) {
nextSym();
}
else {
String ss1 = err.report(33); // 格式錯誤,應是右括號
ss = ss + ss1 + "\n";
while (!fsys.get(sym)) {
nextSym();
}
}
}
/**
* 分析<賦值語句>
* @param fsys 后跟符號集
* @param lev 當前層次
*/
private void parseAssignStatement(SymSet fsys, int lev) {
int i;
SymSet nxtlev;
i = table.position(lex.id);
if (i > 0) {
Table.Item item = table.get(i);
if (item.kind == Objekt.variable) {
nextSym();
if (sym == Symbol.becomes) {
nextSym();
nxtlev = (SymSet) fsys.clone();
parseExpression(nxtlev, lev);
// parseExpression將產生一系列指令,但最終結果將會保存在棧頂,執行sto命令完成賦值
interp.gen(Fct.STO, lev - item.level, item.adr);
}
else {
if (sym == Symbol.lparen) { // 數組啦...
nextSym();
nxtlev = (SymSet) fsys.clone();
parseExpression(nxtlev, lev);
// parseExpression將產生一系列指令,但最終結果將會保存在棧頂,執行sto命令完成賦值
//在expression最后已經有這個了:nextSym(); //一個)
nextSym(); //一個:=
//后面和var賦值相同,除了最后生成的語句
nextSym();
nxtlev = (SymSet) fsys.clone();
parseExpression(nxtlev, lev);
// parseExpression將產生一系列指令,但最終結果將會保存在棧頂,執行sto命令完成賦值
interp.gen(Fct.STA, lev - item.level,
item.adr);
}
else {
String ss1 = err.report(13); // 沒有檢測到賦值符號
ss = ss + ss1 + "\n";
}
}
}
else {
String ss1 = err.report(12); // 賦值語句格式錯誤
ss = ss + ss1 + "\n";
}
}
else {
String ss1 = err.report(11); // 變量未找到
ss = ss + ss1 + "\n";
}
}
/**
* 分析<表達式>
* @param fsys 后跟符號集
* @param lev 當前層次
*/
private void parseExpression(SymSet fsys, int lev) {
Symbol addop;
SymSet nxtlev;
// 分析[+|-]<項>
if (sym == Symbol.plus || sym == Symbol.minus) {
addop = sym;
nextSym();
nxtlev = (SymSet) fsys.clone();
nxtlev.set(Symbol.plus);
nxtlev.set(Symbol.minus);
parseTerm(nxtlev, lev);
if (addop == Symbol.minus) {
interp.gen(Fct.OPR, 0, 1);
}
}
else {
nxtlev = (SymSet) fsys.clone();
nxtlev.set(Symbol.plus);
nxtlev.set(Symbol.minus);
parseTerm(nxtlev, lev);
}
// 分析{<加法運算符><項>}
while (sym == Symbol.plus || sym == Symbol.minus) {
addop = sym;
nextSym();
nxtlev = (SymSet) fsys.clone();
nxtlev.set(Symbol.plus);
nxtlev.set(Symbol.minus);
parseTerm(nxtlev, lev);
if (addop == Symbol.plus) {
interp.gen(Fct.OPR, 0, 2);
}
else {
interp.gen(Fct.OPR, 0, 3);
}
}
}
/**
* 分析<項>
* @param fsys 后跟符號集
* @param lev 當前層次
*/
private void parseTerm(SymSet fsys, int lev) {
Symbol mulop;
SymSet nxtlev;
// 分析<因子>
nxtlev = (SymSet) fsys.clone();
nxtlev.set(Symbol.times);
nxtlev.set(Symbol.slash);
parseFactor(nxtlev, lev);
// 分析{<乘法運算符><因子>}
while (sym == Symbol.times || sym == Symbol.slash) {
mulop = sym;
nextSym();
parseFactor(nxtlev, lev);
if (mulop == Symbol.times) {
interp.gen(Fct.OPR, 0, 4);
}
else {
interp.gen(Fct.OPR, 0, 5);
}
}
}
/**
* 分析<因子>
* @param fsys 后跟符號集
* @param lev 當前層次
*/
private void parseFactor(SymSet fsys, int lev) {
SymSet nxtlev;
test(facbegsys, fsys, 24); // 檢測因子的開始符號
// the original while... is problematic: var1(var2+var3)
// thanks to macross
// while(inset(sym, facbegsys))
if (facbegsys.get(sym)) {
if (sym == Symbol.ident) { // 因子為常量或變量
int i = table.position(lex.id);
if (i > 0) {
Table.Item item = table.get(i);
switch (item.kind) {
case constant: // 名字為常量
interp.gen(Fct.LIT, 0, item.val);
nextSym();
break;
case variable: // 名字為變量
//為將nextSym()放入次,將nextSym()放在每個case后
nextSym();
if (sym != Symbol.lparen) { //后面不是'(',是變量
interp.gen(Fct.LOD,
lev - item.level, item.adr);
}
else { //是數組
int ltmp = lev - item.level;
int adrtmp = item.adr;
nextSym();
nxtlev = (SymSet) fsys.clone();
nxtlev.set(Symbol.rparen);
parseExpression(nxtlev, lev);
interp.gen(Fct.LDA, ltmp,
adrtmp);
nextSym(); //nextSym(); //),=
//TODO interp沒有修改
}
//nextSym();
break;
case procedure: // 名字為過程
String ss1 = err.report(21); // 不能為過程
ss = ss + ss1 + "\n";
nextSym();
break;
}
}
else {
String ss1 = err.report(11); // 標識符未聲明
ss = ss + ss1 + "\n";
}
}
else if (sym == Symbol.number) { // 因子為數
int num = lex.num;
if (num > PL0.amax) {
String ss1 = err.report(31);
ss = ss + ss1 + "\n";
num = 0;
}
interp.gen(Fct.LIT, 0, num);
nextSym();
}
else if (sym == Symbol.lparen) { // 因子為表達式
nextSym();
nxtlev = (SymSet) fsys.clone();
nxtlev.set(Symbol.rparen);
parseExpression(nxtlev, lev);
if (sym == Symbol.rparen) {
nextSym();
}
else {
String ss1 = err.report(22); // 缺少右括號
ss = ss + ss1 + "\n";
}
}
else {
// 做補救措施
test(fsys, facbegsys, 23);
}
}
}
/**
* 分析<條件>
* @param fsys 后跟符號集
* @param lev 當前層次
*/
private void parseCondition(SymSet fsys, int lev) {
Symbol relop;
SymSet nxtlev;
if (sym == Symbol.oddsym) {
// 分析 ODD<表達式>
nextSym();
parseExpression(fsys, lev);
interp.gen(Fct.OPR, 0, 6);
}
else {
// 分析<表達式><關系運算符><表達式>
nxtlev = (SymSet) fsys.clone();
nxtlev.set(Symbol.eql);
nxtlev.set(Symbol.neq);
nxtlev.set(Symbol.lss);
nxtlev.set(Symbol.leq);
nxtlev.set(Symbol.gtr);
nxtlev.set(Symbol.geq);
parseExpression(nxtlev, lev);
if (sym == Symbol.eql || sym == Symbol.neq
|| sym == Symbol.lss || sym == Symbol.leq
|| sym == Symbol.gtr || sym == Symbol.geq) {
relop = sym;
nextSym();
parseExpression(fsys, lev);
switch (relop) {
case eql:
interp.gen(Fct.OPR, 0, 8);
break;
case neq:
interp.gen(Fct.OPR, 0, 9);
break;
case lss:
interp.gen(Fct.OPR, 0, 10);
break;
case geq:
interp.gen(Fct.OPR, 0, 11);
break;
case gtr:
interp.gen(Fct.OPR, 0, 12);
break;
case leq:
interp.gen(Fct.OPR, 0, 13);
break;
}
}
else {
String ss1 = err.report(20);
ss = ss + ss1 + "\n";
}
}
}
public String ret() {
return ss;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -