1、计算机编译原理编译程序构造实践第二版 附录三 文法输入输出系统的部分程序代码附录三 在Visual C+开发平台上开发文法输入输出系统的部分程序代码本附录给出的是在Visual C+开发平台上所开发应用系统中与用户添加部分相关的的部分可执行程序,请读者注意在程序中何处给出用户添加部分。建议读者结合实际操作,进行对照,以熟练Visual C+开发平台的应用。/* * Mainfrm.h * */ MainFrm.h : interface of the CMainFrame class/#if !defined(AFX_MAINFRM_H_CA8C9B0D_82A4_4D43_BD70_6B3D
2、C428B2FF_INCLUDED_)#define AFX_MAINFRM_H_CA8C9B0D_82A4_4D43_BD70_6B3DC428B2FF_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000class CMainFrame : public CFrameWnd protected: / create from serialization only CMainFrame(); DECLARE_DYNCREATE(CMainFrame)/ Attributespublic:/ Operationspublic:/
3、 Overrides / ClassWizard generated virtual function overrides /AFX_VIRTUAL(CMainFrame) virtual BOOL PreCreateWindow(CREATESTRUCT& cs); /AFX_VIRTUAL/ Implementationpublic: virtual CMainFrame();#ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const;#endifprotected: /
4、 control bar embedded members CStatusBar m_wndStatusBar; CToolBar m_wndToolBar;/ Generated message map functionsprotected: /AFX_MSG(CMainFrame) afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnGread(); /* 用户定义,自动生成 */ afx_msg void OnGstore(); afx_msg void OnAppExit(); /AFX_MSG DEC
5、LARE_MESSAGE_MAP();/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif / !defined(AFX_MAINFRM_H_CA8C9B0D_82A4_4D43_BD70_6B3DC428B2FF_INCLUDED_)/* * Maingfrm.cpp * */ MainFrm.cpp : implementation of the CMainFrame class#include std
6、afx.h#include 文法输入输出系统.h /* 用户定义,自动生成 */#include MainFrm.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif#include GREAD.h /* 用户添加 */GREAD Dlg1;#include DISPG.hDISPG Dlg2;CString StartSymbol; /* 用户添加 */CString Products;CString VNC;CString VTC;/ CMainFrameIMPLEM
7、ENT_DYNCREATE(CMainFrame, CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) /AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_COMMAND(ID_GREAD, OnGread) /* 用户定义,自动生成 */ ON_COMMAND(ID_GSTORE, OnGstore) ON_COMMAND(ID_APP_EXIT, OnAppExit) /AFX_MSG_MAPEND_MESSAGE_MAP()static UINT indicators = ID_SEPARATOR, /
8、status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL,;/ CMainFrame construction/destructionCMainFrame:CMainFrame() / TODO: add member initialization code hereCMainFrame:CMainFrame()int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CFrameWnd:OnCreate(lpCreateStruct) =
9、 -1) return -1; if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) | !m_wndToolBar.LoadToolBar(IDR_MAINFRAME) TRACE0(Failed to create toolbarn); return -1; / fail to create if (!m_wndStatusBar.Create(this)
10、| !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT) TRACE0(Failed to create status barn); return -1; / fail to create / TODO: Delete these three lines if you dont want the toolbar to / be dockable m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); Dock
11、ControlBar(&m_wndToolBar); return 0;BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs) if( !CFrameWnd:PreCreateWindow(cs) ) return FALSE; / TODO: Modify the Window class or styles here by modifying / the CREATESTRUCT cs return TRUE;/ CMainFrame diagnostics#ifdef _DEBUGvoid CMainFrame:AssertValid() co
12、nst CFrameWnd:AssertValid();void CMainFrame:Dump(CDumpContext& dc) const CFrameWnd:Dump(dc);#endif /_DEBUG/ CMainFrame message handlersvoid CMainFrame:OnGread() /*用户定义,自动生成 */ / TODO: Add your command handler code here Dlg1.DoModal( ); /*用户添加*/void CMainFrame:OnGstore() /*用户定义,自动生成 */ / TODO: Add yo
13、ur command handler code here Dlg2.m_SSV = StartSymbol; /*用户添加*/ Dlg2.m_RulesV = Products; Dlg2.m_VTSV = VTC; Dlg2.m_VNSV = VNC; Dlg2.DoModal( );void CMainFrame:OnAppExit() /*用户定义,自动生成 */ / TODO: Add your command handler code here CMainFrame:OnClose( ); /*用户添加*/* * GREAD.h * */#if !defined(AFX_GREAD_
14、H_F0B82C30_67C6_42C1_9CE2_F10546EB47CF_INCLUDED_)#define AFX_GREAD_H_F0B82C30_67C6_42C1_9CE2_F10546EB47CF_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000/ GREAD.h : header file/ GREAD dialogclass GREAD : public Cdialog /*用户定义,自动生成 */ / Constructionpublic: GREAD(CWnd* pParent = NULL); /
15、standard constructor/ Dialog Data /AFX_DATA(GREAD) enum IDD = IDD_INPUTG ; CEdit m_RuleV; /* 用户定义,自动生成 */ CEdit m_SV; /AFX_DATA/ Overrides / ClassWizard generated virtual function overrides /AFX_VIRTUAL(GREAD) protected: virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support /AFX_VIRTUAL
16、/ Implementationprotected: / Generated message map functions /AFX_MSG(GREAD) virtual void OnOK(); /*用户定义,自动生成 */ virtual void OnCancel(); afx_msg void OnReinput(); /AFX_MSG DECLARE_MESSAGE_MAP();/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the prev
17、ious line.#endif / !defined(AFX_GREAD_H_F0B82C30_67C6_42C1_9CE2_F10546EB47CF_INCLUDED_)/* * GREAD.CPP * */ GREAD.cpp : implementation file/#include stdafx.h#include 文法输入输出系统.h /* 用户定义,自动生成 */#include GREAD.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifextern
18、 GREAD Dlg1; /* 用户添加的自定义的外部数据对象 */extern CString StartSymbol;extern CString Products;extern CString VNC;extern CString VTC;char Input3030; /* 用户添加的自定义的数据类型和数据对象 */typedef struct char LeftSym; char Rightpart20; int RightLength; RuleT;RuleT GrammarC20;char VT20;char VN20;int NVN=0,NVT=0;typedef struct
19、 int LeftSymNum; int RightpartNum20; int RightLength; RuleType;RuleType Grammar20;int RuleN;char StartSym;int LineNumofG;int InputLength;/ GREAD dialogGREAD:GREAD(CWnd* pParent /*=NULL*/) /* 用户定义,自动生成 */ : CDialog(GREAD:IDD, pParent) /AFX_DATA_INIT(GREAD) /AFX_DATA_INITvoid GREAD:DoDataExchange(CDat
20、aExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(GREAD) DDX_Control(pDX, IDC_RULEV, m_RuleV); /* 用户定义,自动生成 */ DDX_Control(pDX, IDC_SV, m_SV); /AFX_DATA_MAPBEGIN_MESSAGE_MAP(GREAD, CDialog) /AFX_MSG_MAP(GREAD) ON_BN_CLICKED(IDC_REINPUT, OnReinput) /* 用户定义,自动生成 */ /AFX_MSG_MAPEND_MESSAGE_MAP
21、()/ GREAD message handlers/* 用户自定义的函数 */void GetGrammar( ) /* 从过渡文法转换到文法的存储表示 */ char LeftS,Sym; int k,j,m; StartSym=GrammarC1.LeftSym; for(k=1; k=RuleN; k+) LeftS=GrammarCk.LeftSym; for(j=1; j=NVN; j+) if(LeftS=VNj) Grammark.LeftSymNum=j+100; break; for(j=1; j=GrammarCk.RightLength; j+) Sym=Grammar
22、Ck.Rightpartj; for(m=1; m=NVN; m+) if(Sym=VNm) Grammark.RightpartNumj=m+100; break; if(m=NVN) continue; for(m=1; m=NVT; m+) if(Sym=VTm) Grammark.RightpartNumj=m; break; Grammark.RightLength=GrammarCk.RightLength; void GetInput( ) /* 把界面键入的数据存入Input中 */ int k,len, row=1,colum; char c; Input00=0; colu
23、m=0; len=Products.GetLength( ); for(k=0; k=len-1; k+) c=Productsk; if(c=n|c=012) Inputrowcolum=0; +row; colum=0; else if(c=015) continue; else if(c=0) Inputrowcolum=0; break; else /*c!=n& c!=0*/ Inputrowcolum+=c; LineNumofG=row;void StoreG( ) /* 把Input中的输入转换为字符型过渡文法 */ int row,colum, k,j,m; char sym
24、, U; StartSym=StartSymbol0; GetInput( ); RuleN=0; row=1; NVN=NVT=0; while(row=LineNumofG) colum=0; sym=Inputrowcolum; for(k=1; kNVN) VN+NVN=sym; GrammarC+RuleN.LeftSym=sym; colum=colum+4; /*规则行中放过符号“:=”*/ j=0; /*规则右部位置*/ while(Inputrowcolum!=0) /*规则右部未完)*/ sym=Inputrowcolum+; if(sym=|) GrammarCRuleN
25、.Rightpartj+1=0; GrammarCRuleN.RightLength=j; U=GrammarCRuleN.LeftSym; RuleN=RuleN+1; GrammarCRuleN.LeftSym=U; j=0; continue; /*继续while循环*/ else if(sym=n|sym=0) break; j=j+1; GrammarCRuleN.Rightpartj=sym; for(k=1;kNVT) /*sym不在VT中*/ VT+NVT=sym; /*多字符符号时需用函数strcpy*/ /*处理一行规则while结束*/ GrammarCRuleN.Rig
26、htLength=j; row=row+1; /* 处理文法while结束 */ /*从VT中删除出现在VN中的符号,求得VT基数*/ for( m=1; m=NVT; m+) for(k=1; k=NVN; k+) if(VTm=VNk) /*是非终结符号*/ VTm= ; break; for(m=1;m=NVT; m+) if(VTm= ) for(j=m+1; j=NVT; j+) VTj-1=VTj; /*删除VTm, 把其后的元素上移*/ NVT=NVT-1; if(VTm= ) m=m-1; continue; GetGrammar( ); /*转换成存储表示的文法*/void SetG( ) /* 为输出显示,置好界面全局数据对象 */ int i,k,j,m; char VNTmp20,VTTmp20,RuleTmp100; j=0; for
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2