?? syntax.java
字號:
//------------------------------------------------
//類描述: 語法分析類,分析語法,記錄符號表,處理語法錯誤
//文件名: Sytax.java
//------------------------------------------------
package cp;
class Syntax {
int id = 0;
String sym= null;
int oldid = 0;
String oldsym = null;
int oldSP = 0;
String tabFunc[][] = new String[50][2];//函數登記//函數名-返回類型
String funcParam[][] = new String[50][10];//行參登記//類型-標識.....類型-標識//行存儲格式
String tabVar[][] = new String[50][4];//變理登記//標識-類型-值-范圍(范圍與函數符號表的下標有關)
String preStr[] = new String[2];
int tabFPoint = 1;
int tabVPoint = 0;
String exp = "";
boolean isFuncEnd = true; //函數分析標志--是否還處在分析未完成狀態
boolean isOneTime = false;//次數標志
StringBuffer errInfo = new StringBuffer();
int oldLine = 0;
Lex lex = null;
Syntax(String filepath) {
lex = new Lex(filepath);
start();
}
//取下一個單詞
int nextSYM(){
oldsym = sym;
oldid = id;
oldSP = lex.sbPoint;
id=lex.getSYM();
sym = lex.sym;
return id;
}
//開始分析
int start(){
if(nextSYM()==-1) return -1;
switch (id) {
case 0://非法字符
err(1);
jumpErrorLine();
break;
case 1://定義性語句
if(pre()==-1) return -1;
if(nextSYM()==-1) return -1;
if(sym.equals("(")){//函數定義
tabFunc[tabFPoint][0] = preStr[1];
tabFunc[tabFPoint][1] = preStr[0];
func();
}
if(sym.equals("=")) definition();//變量定義
break;
case 4:
if(nextSYM()!=1)
if(sym.equals("=")) var();
else{
err(15);
jumpErrorLine();
}
break;
default:
err(15);
break;
}
start();
return 1;
}
//定義性語句頭部處理
int pre(){
if(sym.matches(Compiler.DE_WORDS)) preStr[0] = sym;
else err(2);//非法保留字
if(nextSYM()==-1) return -1;
if(sym.matches(Compiler.ID)) preStr[1] = sym;
else err(5);//標識符錯誤
return 1;
}
//函數處理
int func() {
isFuncEnd = false;
if( recordParameter() == -1 ) return -1;
if(nextSYM()==-1) return -1;
if(sym.equals("{")) comStatement();
if(!sym.equals("}")) err(11);
else tabFPoint++;
isFuncEnd = true;
return 1;
}
//形參登記
int recordParameter(){
int i = 0;
while( nextSYM()!=-1 ){
if( (i % 2)==0 ){
if(sym.equals(")") ) break;
if(sym.matches(Compiler.DE_WORDS) ) funcParam[tabFPoint][0] = sym;
else err(2); //非法保留字
i++;
}
else if(sym.matches(Compiler.ID)){
funcParam[tabFPoint][1] = sym;
i++;
}
else{
err(5); //形參標識符錯
i++;
}
}
if(id == -1) return -1;
else return 1;
}
int callFunc(){
//調用形式是否正確,待擴充----------------------------------------------------
return 1;
}
//賦值處理
int var(){
if(expression()!=-1)
if(sym.equals(";")) ;
else{
err(7);
return -1;
}
return 1;
}
//復合語句處理
int comStatement(){
while(nextSYM()!=-1&&!sym.equals("}")){
switch (id) {
case 0://非法字符
err(1);
jumpErrorLine();
break;
case 1://定義性語句
if(pre()==-1) return -1;
if(nextSYM()==-1) return -1;
if(sym.equals("(")){//函數定義
;//函數嵌套出錯處理, 待擴充
}
if(sym.equals("=")) definition();//變量定義
break;
case 3://控制語句
control();
break;
case 4://函數調用語句或賦值
if(nextSYM()==-1) return -1;
if(sym.equals("(")) callFunc();
else if(sym.equals("=")) var();
break;
}
if(isOneTime) {
isOneTime = false;
break;
}
}
return 1;
}
//控制語句處理
int control(){
if(sym.equals("if")){
if (endErr())return -1;
if (sym.equals("(")) {
condition();
if (endErr()) return -1;
if (sym.equals("{")) {
comStatement(); //若是大括號 復合語句分析
if (!sym.equals("}")) err(11);
}
else { //否則語句分析
isOneTime = true;
Lex.sbPoint = oldSP;
comStatement();
}
}
if (nextSYM() == -1) return -1;
if (sym.equals("else")) { //若是”else"
if (nextSYM() == -1) return -1;
if (sym.equals("{")) {
comStatement(); //若是大括號 復合語句分析
if (!sym.equals("}")) err(11);
}
else { //否則語句分析
isOneTime = true;
Lex.sbPoint = oldSP;
comStatement();
}
}
else return 1;
}
else if(sym.equals("while")){
if(endErr()) return -1;
condition();
if(endErr()) return -1;
if(sym.equals("{")){
comStatement(); //若是大括號 復合語句分析
if(!sym.equals("}")) err(11);
}
else{//否則語句分析
isOneTime = true;
Lex.sbPoint = oldSP;
comStatement();
}
}
else if(sym.equals("else")){
err(16);
if (nextSYM() == -1) return -1;
if (sym.equals("{")) {
comStatement(); //若是大括號 復合語句分析
if (!sym.equals("}")) err(11);
}
else { //否則語句分析
isOneTime = true;
Lex.sbPoint = oldSP;
comStatement();
}
return 1;
}
else if(!isFuncEnd){
if (sym.equals("return")) expression();
if (!sym.equals(";")) err(7);
}
else{
err(15); //語句位置不當,非法語句
jumpErrorLine();
}
return 1;
}
//是否讀完
boolean endErr(){
if(nextSYM()==-1){
err(7); //某某語句錯+缺少分號
return true;
}
else return false;
}
//定義性語句處理
int definition(){
tabVar[tabVPoint][0] = preStr[1];
tabVar[tabVPoint][1] = preStr[0];
expression();
tabVar[tabVPoint][2] = exp;
if(!isFuncEnd) tabVar[tabVPoint][3] = ""+tabFPoint;//局部變量
else tabVar[tabVPoint][3] = "0";//全局變量
tabVPoint++;
if (!sym.equals(";")) err(7);//缺失;號
return 1;
}
//表達式處理
int expression(){
StringBuffer stack = new StringBuffer();
int sp = 1;
int i = 0;
exp = "";
while( nextSYM()!=-1 && !( sp==1&&sym.equals(")") || sym.equals(";") ) ){
if(i%2==0){
if (sym.equals(")")){
sp--;
}
else if (sym.equals("(")){
stack.append(sym);
sp++;
}
else if ( id==4 || id==5 || id==6 || id==2 ){
exp += sym;
i++;
}
else err(4);//無效運算量錯
}
else if( sym.matches("[+|*|/]") || sym.equals("-") ){
exp += sym;
i++;
}
}
if(exp.equals("")) err(13);//表達式不能為空
if(exp.length()>0){
String expTemp = exp.substring(exp.length() - 1, exp.length());
if ( expTemp.matches("[+|*|/]") || expTemp.equals("-") )
err(14); //錯誤的表達式
}
if(sp<1) err(9);//缺失(括號
if(sp>1) err(10);//缺失)括號
return 1;
}
//因子處理
int factor(String fac){
//待擴充
return 1;
}
//條件處理
int condition(){
expression();
if(!sym.equals(")")) err(9);//)號不匹配
return 1;
}
//出錯處理函數,記錄行號,出錯處相關行的字符
void err(int er) {
errInfo.append("test.txt"+":"+lex.line+":"+" "+Compiler.errText[er]+"\n");
}
//讀取出錯行
void jumpErrorLine(){
oldLine = lex.line;
while(nextSYM()!=-1 && !sym.equals(";"))
if(oldLine!=lex.line){
lex.sbPoint = oldSP;
break;
}
}
//-------------------------------測試-----------------------------------------------
public static void main(String args[]) {
//Syntax syntax = new Syntax("E:\\Java\\work\\N46020117\\cpLab\\classes\\test.txt");//調試后刪除
Syntax syntax = new Syntax(args[0]);
System.out.println(syntax.errInfo.toString());
if(syntax.errInfo.length()==0){
System.out.println("----------------------Symbol Table---------------------");
System.out.println();
syntax.printFunc();
System.out.println("-------------------------------------------------------");
syntax.printVar();
System.out.println("-------------------------------------------------------");
}
}
//函數符號表調試
void printFunc(){
System.out.println("FuncID\t"+"Type\t"+"Param");
for(int i=1; i<tabFPoint&&tabFunc[i][0]!=null; i++){
for(int j=0; j<2; j++){
System.out.print(tabFunc[i][j]+"\t");
}
for(int k =0; funcParam[i][k]!=null&&k<10; k++)
System.out.print(funcParam[i][k]+"\t");
System.out.println();
}
}
//變量表調試
void printVar(){
System.out.println("VarID\t"+"Type\t"+"Value\t"+"Scope");
for(int i=0; i<tabVPoint&&tabVar[i][0]!=null; i++){
for(int j=0; j<4; j++)
System.out.print(tabVar[i][j]+"\t");
System.out.println();
}
}
//-------------------------------------------------------------------------------------
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -