⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lexdemoview.h

📁 包括一个LR(1)的语法分析程序和一个LL(1)的语法分析程序的例子
💻 H
字号:
// lexDemoView.h : interface of the CLexDemoView class
//
/////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_LEXDEMOVIEW_H__7DB84B6A_C098_4A7C_A1BC_C83D54B9C8DF__INCLUDED_)
#define AFX_LEXDEMOVIEW_H__7DB84B6A_C098_4A7C_A1BC_C83D54B9C8DF__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "Stack.h"
#include "LexUtil.h"
class CLexDemoView : public CView
{
protected: // create from serialization only
	CLexDemoView();	DECLARE_DYNCREATE(CLexDemoView)

// Attributes
public:
	CLexDemoDoc* GetDocument();

// Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CLexDemoView)
	public:
	virtual void OnDraw(CDC* pDC);  // overridden to draw this view
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
	protected:
	virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
	virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
	virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CLexDemoView();
#ifdef _DEBUG
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// Generated message map functions
protected:
	//{{AFX_MSG(CLexDemoView)
	afx_msg void OnFileOpen();
	afx_msg void OnLlOne();
	afx_msg void OnReversePoland();
	afx_msg void OnLrZero();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
public:
	Status LexAnal();   //语法分析函数
private:
	Status AddToListForLL(Stack<CString> statusStack);  //为LL(1)分析过程在ListBox中添加分析的中间过程
	Status AddToListForLR(Stack<CString> statusStack, Stack<CString> symbolStack);  //为LR分析过程在ListBox中添加分析的中间结果
	Status InitAnalTable();  //分析表构造函数
	Status InitAnalStack();  //初始化分析栈  
	Status InitStatusStack(Stack<CString> &statusStack); //初始化(LR0)分析栈
	Status InitSymbolStack(Stack<CString> &symbolStack); //初始化(LRO)符号栈
	Status InitLRTable(LRElem actionTable[], ElemGoto gotoTable[]); ////初始化LR(0)的分析表
	Status InitRegTable(Regulation regTable[]);//初始化LR(0)的规则表
	Status InitListBox();   //对显示语法分析结果的ListBox进行初始化
	LRElem LookInActionTable(LRElem actionTable[], CString statusTop, char chInput);  //根据给定的分析表查询LR(0)的action表获得下一步的动作
	ElemGoto LookInGotoTable(ElemGoto gotoTable[], CString statusTop, CString symbolTop);//根据给出的goto表查询下一状态
	Status GetNextInput(char& valOut);  //获得下一个输入的字符
	Status UnGetInput();    //恢复输入指针到前一个字符
	Status SplitPush(char * szVal);
	Status PolandRConvert(CString strSrc, CString& strDst); //进行逆波兰转换  
	Status MakeAsmCode(CString strDst, CString& strOut);    //根据逆逆波兰式生成汇编码
	LElem FindNextState(char * szTop, char chInput);  //根据当前栈顶元素和输入元素查分析表取得下一个状态动作
	bool IsTerminals(CString strVal);
	bool IsOperand(char chVal);  //判断字符是否是操作数
	bool IsOperator(char chVal); //判断字符是否是操作符
	int  GetPRI(char chVal);     //获得运算符的优先级(PRI==Privilege)
	Status GetOpCode(char chOp, CString& strCode); //根据相应的操作符获得对应的asm code
private:
	CEdit m_EditShow; 
	CListBox   m_lstResult;  //用于显示推导过程
	CListBox	 m_lstToken;   //用于显示符号栈中的符号当前所有符号的列表
	Stack<CString> m_analStack;  //LL(1)分析栈
	LElem m_analTable;					//LL(1)分析表
	char  m_szInput[20];				
	long  m_lInputPos;				//输入流指针
};

#ifndef _DEBUG  // debug version in lexDemoView.cpp
inline CLexDemoDoc* CLexDemoView::GetDocument()
   { return (CLexDemoDoc*)m_pDocument; }
#endif

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_LEXDEMOVIEW_H__7DB84B6A_C098_4A7C_A1BC_C83D54B9C8DF__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -