📄 dfa.java
字号:
package Syntax;
public class DFA {
private int max=20;//当前最多闭包个数
private int increment=5;
private int current=0;//当前闭包个数
private int snum=0;//记录产生式个数
// private int cnum=0;//记录字符个数
String info="";
private Closure[] I;
private Sentences ss;
private Characters cs;
public DFA()
{
this.I=new Closure[max];
}
private void increase()
{
int temp=max;
max+=increment;
Closure[] c=new Closure[max];
for(int i=0;i<temp;i++)
{
c[i]=I[i];
}
I=c;
}
public void add(Closure c)
{
if(current==max)increase();
I[current++]=c;
}
private void clear()
{
current=0;
I=new Closure[max];
}
public String initialize(Sentences ss,Characters cs)
{
String error_info="";
Sentence s;
int i=0;
int temp;
this.ss=ss;
this.cs=cs;
int partition=cs.partition;//终结符与非终结符分界
snum=ss.getCurrent();
I[0]=new Closure();
I[0].addItem(0);
I[0].c_queue.insert(partition+1);
current++;
///////开始计算I[0]的闭包//////
computer_closure();
/*while(i<current)
{
while(!I[i].c_queue.isEmpty())//产生下一个闭包
{
temp=I[i].c_queue.remove();
Closure c=go(I[i],temp);
}
}
//s=sentences.getSentences(i);*/
return error_info;
}
public Closure go(Closure I,int index)
{
Closure c=new Closure();
return c;
}
public void computer_closure()
{
int c=current-1;//当前闭包序号
int partition=cs.partition;//终结符与非终结符分界
int i=0;//当前闭包中的第一个产生式
int index;//产生式索引
int d;//加点处
int right;
int temp;
Queue q;
int num=I[c].nitem;
while(i<num)//<=闭包中的产生式个数
{
index=I[c].items[i].s_index;//当前闭包的第i个产生式的索引
d=I[c].items[i].dot_at;
right=ss.sentences[index].getRight(d);
if(right==-1)I[c].items[i].shift=false;//标记为归约项
else
{
if(!I[c].c_queue.find(right))I[c].c_queue.insert(right);
if(right>partition)
{
q=ss.findSentence(right);
while(!q.isEmpty())
{
temp=q.remove();//info+=temp;
if(!I[c].findItem(temp, 0))I[c].addItem(temp);
}
}
}
num=I[c].nitem;//info+=I[c].nitem;
i++;//info+=I[c].nitem+""+i;
}
}
public String show_dfa()
{
for(int i=0;i<current;i++)
{
info+=" I["+i+"]:\n";
for(int j=0;j<I[i].nitem;j++)
{
int s=I[i].items[j].s_index;
int d=I[i].items[j].dot_at;
info+=ss.showSingle(s,d);
}
for(int k=0;k<I[i].c_queue.size();k++)
{
info+=cs.getCharacter(I[i].c_queue.peek(k))+",";
}
info+="\n";
}
return info;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -