资源简介

预测分析法自顶向下分析如下文法: E→E+T│T , T→T*F│F , F→(E)│i 。 程序不包含词法分析,请显式以空格分隔输入符。

资源截图

代码片段和文件信息

// PreAna.cpp : Defines the entry point for the console application.
//

#include “stdafx.h“
#include 
#include “ProAnaDef.h“
using namespace std;





int _symbol_num = 13;
//                                    0   1    2    3    4    5    6    7    8     9    10   11     12
char _symbol[16][MAX_SYMBOL_NAME] = {““ “+“ “*“ “(“ “)“ “i“ “#“ “E“ “E‘“ “T“ “T‘“ “F“ “null“};


//产生式列表
int _profom[][MAX_PROFOR_NAME] = {
//00
//E‘→ +TE‘ 
1 9 8 0 0 0
//01
//T‘→ null
12 0 0 0 00 
//02
//T‘→ *FT‘
2 11 10 0 0 0
//03
//E → TE‘
9 8 0 0 0 0
//04
//T → FT‘
11 10 0 0 0 0
//05
//F → ( E )
3 7 4 0 0 0
//06
//E‘→ null
12 0 0 0 0 0
//07
//T‘→ null
12 0 0 0 0 0
//08
//E → TE‘
9 8 0 0 0 0
//09
//T → FT‘
11 10 0 0 0 0
//10
//F → i 
5 0 0 0 0 0
//11
//E‘→ null
12 0 0 0 0 0
//12
//T‘→ null
12 0 0 0 0 0

};

//预测分析表
int _pre_table[5][6] = {
-1 -1 3 -1 8 -1
0 -1 -1 6 -1 11 
-1 -1 4 -1 9 -1
1 2 -1 7 -1 12 
-1 -1 5 -1 10 -1
};



//env

int _top = 0;
int _stack[256] = {0};

int _coming_token = 0;
//int _stack_top_token = 0;


//functions
int ComingToken()
{
return _coming_token;
}



//
char _unknown_symbol[MAX_SYMBOL_NAME] = {0};

void SetUnknownSymbol(const char* pBuf)
{
strcpy_s(_unknown_symbol MAX_SYMBOL_NAME pBuf);
}


void GetUnknownSymbol(char buf[] const int size)
{
strcpy_s(buf size _unknown_symbol);
}




//last error
int _ana_error_code = 0;

//
void Leave(int err)
{
_ana_error_code = err;
throw err;
}






//
//stack support
int StackGet()
{
if (_top <= 0)
{
Leave(ANA_ERROR_STACK_EMPTY);
}

return _stack[_top - 1];
}

void StackPush(int val)
{
_stack[_top++] = val;
}

int StackPop()
{
if (_top <= 0)
{
Leave(ANA_ERROR_STACK_EMPTY);
}

return _stack[--_top];
}

bool StackEmpty()
{
return (_top == 0);
}

int StackElements()
{
return _top;
}

int StackAt(int index)
{
return _stack[index];
}



bool StrEqual(char src[] char tar[])
{
if (0 == strcmp(src tar))
{
return true;
}

return false;
}



int MapSymbolId(char sym[])
{
int i = 0;
for (i = 1; i < _symbol_num; i++)
{
if (StrEqual(sym _symbol[i]))
{
return i;
}
}

return 0;
}

void MapSymbolName(char buf[] int size int id)
{
if (0 != strcpy_s(buf size _symbol[id]))
{
throw id;
}
}


bool IsSymbolT(int symId)
{
if (symId > 0 && symId < 6)
{
return true;
}

return false;
}


int SymbolNull()
{
return 12;
}

bool IsSymbolNull(int symId)
{
if (symId == SymbolNull())
{
return true;
}

return false;
}

int SymbolEnd()
{
return 6;
}

bool IsSymbolEnd(int symId)
{
if (symId == SymbolEnd())
{
return true;
}

return false

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      65536  2011-12-11 23:27  PreAna\Debug\PreAna.exe

     文件       5985  2011-12-11 23:24  PreAna\PreAna\PreAna.cpp

     文件       4449  2011-12-11 20:33  PreAna\PreAna\PreAna.vcxproj

     文件       1521  2011-12-11 20:33  PreAna\PreAna\PreAna.vcxproj.filters

     文件        143  2011-12-11 15:40  PreAna\PreAna\PreAna.vcxproj.user

     文件       4139  2011-12-11 23:26  PreAna\PreAna\PreAnaShow.cpp

     文件        253  2011-12-11 20:35  PreAna\PreAna\ProAnaDef.h

     文件       1708  2011-12-11 15:40  PreAna\PreAna\ReadMe.txt

     文件        293  2011-12-11 15:40  PreAna\PreAna\stdafx.cpp

     文件        320  2011-12-11 15:40  PreAna\PreAna\stdafx.h

     文件        314  2011-12-11 15:40  PreAna\PreAna\targetver.h

     文件       1336  2011-12-11 21:56  PreAna\PreAna.sln

    ..A..H.     12800  2011-12-12 00:30  PreAna\PreAna.suo

     目录          0  2011-12-22 11:59  PreAna\Debug

     目录          0  2011-12-22 11:59  PreAna\ipch

     目录          0  2011-12-22 12:00  PreAna\PreAna

     目录          0  2011-12-22 11:59  PreAna

----------- ---------  ---------- -----  ----

                98797                    17


评论

共有 条评论