示例#1
0
 public void makeParsTable(ParsTable parsTable)
 {
     StateNode stateTemp = first;
             ParsTableItem item;
     while(stateTemp != null)
     {
         StateExportNode stateExport = stateTemp.exports.Head;
         while(stateExport != null)
         {
             item.number=stateExport.data.distinationState;
             if(stateExport.data.isTerminal)
             {
                 item.method=METHOD.S;
             }
             else
             {
                 item.method=METHOD.G;
             }
             parsTable[stateTemp.StateNumber,stateExport.data.expStr]=item;
             stateExport = stateExport.next;
         }
         StateLawNode stateLaw = stateTemp.laws.Head;
         item.method=METHOD.R;
         while(stateLaw !=null)
         {
             if(stateLaw.data.IsDotEnded)
             {
                 LawsNode law=parsHead.findLaw(stateLaw.data.lawNum);
                 Stack follows=new Stack();
                 Stack checkedNonTerm= new Stack();
                 nonTerminals nonTerm = law.parts.Parent.Parent.NonTerminals;
                 nonTerm.getFollow(law.parts.Parent.Parent.item.Name,follows,checkedNonTerm);
                 item.number = stateLaw.data.lawNum;
                 while(follows.Count !=0)
                 {
                     parsTable[stateTemp.StateNumber,follows.Pop().ToString()]=item;
                 }
             }
                 stateLaw = stateLaw.next;
         }
         stateTemp =stateTemp.next;
     }
 }
示例#2
0
 private void New_Click(object sender, System.EventArgs e)
 {
     if(saveConfirm(sender,e))
     {
         this.content.Clear();
         this.Text="New Grammer";
         this.path="";
         this.parsTable = null;
         this.parsHead = null;
         this.result.Items.Clear();
         this.lstFirstFollow.Items.Clear();
     }
 }
示例#3
0
        private void MakeStates_Click(object sender, System.EventArgs e)
        {
            try
            {
                result.Items.Clear();

                parsHead=new ParsHead();
                foreach(string s in content.Lines)
                    parsHead.load(s);
                states=new State(parsHead);
                states.create();
                parsTable=new ParsTable(states.StateCount,ParsHead.terminals,parsHead.Head,this.dgTabel);
                states.makeParsTable(this.parsTable);

                parsTable.showContents(result);

                PrintProductions();

                tabControl1.SelectedIndex=2;
                parsTable.writeGrid();
                SaveFileDialog saveDlg=new SaveFileDialog();
                saveDlg.Filter="(*.prt)|*.prt";
                if(saveDlg.ShowDialog()==DialogResult.OK)
                {

                    StreamWriter sw = new StreamWriter(saveDlg.FileName);
                    foreach (string s in result.Items)
                        sw.WriteLine(s);
                    sw.Close();

                //	parsTable.saveTo(sw);

                }
            }
            catch(Exception ex)
            {
            //				MessageBox.Show(ex.Message);
                MessageBox.Show("Grammar is incorrect : please check your grammar , example : There is one NonTerminal in Right side that never apear in left side!!!");
            }
        }