?? lrsyntax.cs
字號:
using System;
using System.Collections;
namespace Analyzer
{
/// <summary>
/// LRSyntax 的摘要說明。
/// </summary>
public class LRSyntax
{
private int[,] LR;
private ArrayList symbolTable;
public LRSyntax(ArrayList symbolTable,int[,] LR)
{
this.LR = LR;
this.symbolTable = symbolTable;
}
public void analyzer()
{
int[] state = new int[100];
string[] symbol =new string[100];
state[0]=0;
symbol[0]="#";
string[] start = new string[16];
start[0] = "Z";
start[1] = "S";
start[2] = "A";
start[3] = "C";
start[4] = "D";
start[5] = "E";
start[6] = "B";
start[7] = "F";
start[8] = "F";
start[9] = "G";
start[10] = "H";
start[11] = "I";
start[12] = "K";
start[13] = "L";
start[14] = "M";
start[15] = "J";
int[] lengh = new int[16];
//讀入lengh
lengh[0]=1;
lengh[1]=2;
lengh[2]=3;
lengh[3]=1;
lengh[4]=1;
lengh[5]=1;
lengh[6]=3;
lengh[7]=2;
lengh[8]=1;
lengh[9]=3;
lengh[10]=1;
lengh[11]=3;
lengh[12]=1;
lengh[13]=1;
lengh[14]=1;
lengh[15]=1;
ArrayList tokenArray = new ArrayList();
//tokenArray=(ArrayList)symbolTable[0];
int [] wordNum = new int[100];
int offset = 0;
for(int temp=0;temp<symbolTable.Count-1;temp++)
{
tokenArray=(ArrayList)symbolTable[temp];
if(tokenArray[1].ToString().Equals("int"))
{
wordNum[offset]=4;
offset++;
}
else if(tokenArray[1].ToString().Equals("void"))
{
wordNum[offset]=0;
offset++;
}
else if(tokenArray[1].ToString().Equals("main"))
{
wordNum[offset]=1;
offset++;
}
else if(tokenArray[1].ToString().Equals("("))
{
tokenArray=(ArrayList)symbolTable[temp+1];
if(tokenArray[1].ToString().Equals(")"))
{
wordNum[offset]=2;
}
offset++;
}
else if(tokenArray[1].ToString().Equals(")"))
{
continue;
}
else if(tokenArray[1].ToString().Equals("{"))
{
wordNum[offset]=3;
offset++;
}
else if(tokenArray[1].ToString().Equals("="))
{
wordNum[offset]=6;
offset++;
}
else if(tokenArray[1].ToString().Equals("}"))
{
wordNum[offset]=22;
offset++;
}
else if(tokenArray[1].ToString().Equals(";"))
{
wordNum[offset]=23;
offset++;
}
else if(tokenArray[0].ToString().Equals("ID"))
{
wordNum[offset]=5;
offset++;
}
else if(tokenArray[0].ToString().Equals("NUM"))
{
wordNum[offset]=7;
offset++;
}
}
wordNum[offset] = 24;//終止符號
// for(int ttt = 0;ttt<11;ttt++)
// {
// Console.WriteLine(wordNum[ttt].ToString());
// }
int p1=0;
int p2=0;
Console.WriteLine("//------------------------------------------------------//");
Console.WriteLine("//------------------------語法分析結果------------------//");
Console.WriteLine("//------------------------------------------------------//");
Console.WriteLine("\n過程中規約的順序如下(給出表達式左部):\n");
int t;
while(true)
{
int j,k;
j=state[p2];
k=wordNum[p1];
t=LR[j,k];
if(t==0)
{
//找到報錯處,報錯
tokenArray=(ArrayList)symbolTable[p1];
fail(tokenArray);
break;
}
else
{
if(t==-100)
{
Console.WriteLine("\n");
Console.WriteLine("\n檢測結果:");
Console.WriteLine("代碼通過語法檢測");
break;
}
if(t<0&&t!=-100)
{
string m=start[-t];
Console.Write(m+" ");
int length=lengh[-t];
p2=p2-(length-1);
int right = Search.search(m);
if(right==0)
{
Console.WriteLine("\n");
Console.WriteLine("代碼中有語法錯誤");
break;
}
int a=state[p2-1];
int LRresult= LR[a,right];
state[p2]=LRresult;
symbol[p2]=m;
}
if(t>0)
{
p2=p2+1;
state[p2]=t;
symbol[p2]=Convert.ToString(wordNum[p1]);
p1=p1+1;
}
}
}
}
//失敗時調用的函數
private void fail(ArrayList eArray)
{
//System.out.println(eArray.get(0)+" \""+eArray.get(1)+"\" ("+eArray.get(2)+","+eArray.get(3)+")"+"附近有語法錯誤");
Console.WriteLine("錯誤:");
Console.WriteLine(eArray[0]+" \""+eArray[1]+"\" (行:"+eArray[2]+",列:"+eArray[3]+")"+"附近有語法錯誤");
}
}
class Search
{
public static int search(string x)
{
string[] mysymbol=new string[14];
mysymbol[0]="S";
mysymbol[1]="A";
mysymbol[2]="B";
mysymbol[3]="C";
mysymbol[4]="D";
mysymbol[5]="E";
mysymbol[6]="F";
mysymbol[7]="G";
mysymbol[8]="H";
mysymbol[9]="I";
mysymbol[10]="J";
mysymbol[11]="K";
mysymbol[12]="L";
mysymbol[13]="M";
int r=0;
for(int s=0;s<=13;s++)
{
if(mysymbol[s].Equals(x))
r=s+8;
}
return r;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -