91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

資源簡介

這個編譯器的源代碼是我原先為了完成編譯原理實驗課作業而寫的,所以只具有教學價值,現在發出來和大家共享 ;-)和網上流傳的版本不同,它從文法開始,一直做到了符號表的實現. 想實現自己的編譯器的話,只需在把Initializtion.h中的文法修改為自己的即可.工程結構:Initializtion.h 初始化文法,便于進一步進行分析,它為構造GRAMMAR類提供了信息.其中默認非終極符用括上,修改時需要注意.Grammar.cpp Grammar.h 定義了文法GRAMMAR類,它通過initializtion.h的信息建立文法的內部表示。LL1_Analyser.cpp LL1_Analyser.h 定義了LL1分析器,即LL1_Analyser類.LL1_Recognizer.cpp LL1_Recognizer.h 為LL1語法分析驅動器,可以通過文法,TOKEN序列和LL1分析表,判定語法是否正確,同時驅動動作.Rec_Parse.cpp Rec_Pares.h 實現了遞歸下降分析器Rec_Parse類, 遞歸下降的思想和LL1驅動器一樣,不過是把壓棧改成調用自己,而把彈棧改成返回.Scanner.cpp Scanner.h 實現了詞法分析器,可以將程序變為TOKEN序列. 掃描的源程序文件路徑也在這里被定義(默認為.//demo.txt)Action.cpp Action.h 實現了語義棧的操作,_Action類定義了動作符號所對應的動作.SymTable.cpp SymTable.h 實現了符號表的建立和輸出.希望大家能通過該程序對STL和編譯原理有更深刻的理解,Have Fun and Good Luck! -- David.Morre

資源截圖

代碼片段和文件信息

#include?“stdafx.h“
#include?“Action.h“


void?_Action::call_action(const?symbol?&act_sym?list::iterator?token_pos)
{
switch?(act_sym.second)
{
case?0:
_ProgHead();
return;
case?1:
_Id(token_pos);
return;
case?2:
_baseType(token_pos);
return;
case?3:
_Intc(token_pos);
return;
case?4:
_ArrayType();
return;
case?5:
_RecordType();
return;
case?6:
_TypeDec();
return;
case?7:
_FieldDec();
return;
case?8:
_Param();
return;
case?9:
_VarDec();
return;
case?10:
_ParamVar();
return;
case?11:
_AddLevel();
return;
case?12:
_SubLevel();
return;
};
}


void?_Action::_ProgHead()
{}?

//對標識符直接把內容壓入語義棧
void?_Action::_Id(list::iterator?token_pos)
{
semantic_record?record;
record.record_kind?=?ID;
record.sem_info.id_record=(char?*)?(g->GetStr(token_pos->value)).c_str();
sem_stack.push(record);
cout<<“Push?“<}

//處理基本類型把相應信息壓入語義棧
void?_Action::_baseType(list::iterator?token_pos)
{
semantic_record?record;
record.sem_info.type_record?=?new?TypeIR;
record.record_kind?=?TYPE;
switch?(token_pos->value.second)
{
case?19:?//處理整型
{
record.sem_info.type_record->size?=?1;
record.sem_info.type_record->kind?=?intTy;
cout<<“Push?type?of?integer?in?the?semantic?stack.“< break;
}
case?20:?//處理字符
{
record.sem_info.type_record->size?=?1;
record.sem_info.type_record->kind?=?charTy;
cout<<“Push?type?of?char?in?the?semantic?stack.“< break;
}
default:
{
cerr<<“This?type?is?error!“< exit(1);
}
}
sem_stack.push(record);
}


//處理整型常量直接壓入語義棧
void?_Action::_Intc(list::iterator?token_pos)
{
semantic_record?record;
record.record_kind?=?INTC;
sscanf?((g->GetStr(token_pos->value)).c_str()?“%d“?&record.sem_info.intc);
sem_stack.push(record);

cout<<“Push?“<}

//處理數組類型從語義棧提取lowtop和元素類型信息填入數組語義紀錄中并壓棧
void?_Action::_ArrayType()
{
semantic_record?record;
record.sem_info.type_record?=?new?TypeIR;
record.record_kind?=?TYPE;

semantic_record?b?=?sem_stack.top();
sem_stack.pop();
semantic_record?t?=?sem_stack.top();
sem_stack.pop();
semantic_record?l?=?sem_stack.top();
sem_stack.pop();

assert(l.record_kind?==?INTC);
assert(t.record_kind?==?INTC);
assert(b.record_kind?==?TYPE);
assert(b.sem_info.type_record->size?==?1);

record.sem_info.type_record->kind?=?arrayTy;
record.sem_info.type_record->More.ArrayAttr.low?=?l.sem_info.intc;
record.sem_info.type_record->More.ArrayAttr.top?=?t.sem_info.intc;
if?(b.sem_info.type_record->kind?==?intTy)
record.sem_info.type_record->More.ArrayAttr.elemTy?=?&_intc;
else?if?(b.sem_info.type_record->kind?==?charTy)
record.sem_info.type_record->More.ArrayAttr.elemTy?=?&_charc;
record.sem_info.type_record->s

?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2007-04-20?17:01??Compiler\
?????文件????????9337??2006-03-17?19:48??Compiler\Action.cpp
?????文件?????????953??2006-03-17?19:48??Compiler\Action.h
?????文件?????????612??2006-03-11?22:32??Compiler\Compiler.cpp
?????文件????????5468??2006-03-07?21:29??Compiler\Compiler.dsp
?????文件?????????524??2006-03-07?19:20??Compiler\Compiler.dsw
?????文件??????189440??2007-04-20?17:01??Compiler\Compiler.ncb
?????文件???????57856??2007-04-20?17:01??Compiler\Compiler.opt
?????文件????????1882??2007-04-20?16:21??Compiler\Compiler.plg
?????目錄???????????0??2007-04-20?16:28??Compiler\Debug\
?????文件?????????743??2006-03-11?23:52??Compiler\demo.txt
?????文件????????5574??2006-03-17?16:58??Compiler\Grammar.cpp
?????文件????????1574??2006-03-17?16:50??Compiler\Grammar.h
?????文件????????8482??2006-03-17?16:38??Compiler\Initializtion.h
?????文件????????8444??2006-03-17?17:17??Compiler\LL1_Analyser.cpp
?????文件????????1244??2006-03-17?17:03??Compiler\LL1_Analyser.h
?????文件????????2172??2006-03-17?19:04??Compiler\LL1_Recognizer.cpp
?????文件?????????968??2006-03-17?19:19??Compiler\LL1_Recognizer.h
?????文件????????1188??2007-04-20?16:58??Compiler\readme.txt
?????文件????????1541??2006-03-17?19:17??Compiler\Rec_Parse.cpp
?????文件?????????746??2006-03-11?00:01??Compiler\Rec_Parse.h
?????文件????????3191??2007-04-20?16:20??Compiler\Scanner.cpp
?????文件?????????599??2006-03-17?19:06??Compiler\Scanner.h
?????文件?????????301??2006-03-05?00:05??Compiler\StdAfx.cpp
?????文件????????1103??2006-03-08?12:28??Compiler\StdAfx.h
?????文件????????3650??2006-03-17?19:54??Compiler\SymbTable.cpp
?????文件?????????884??2006-03-17?19:54??Compiler\SymbTable.h
?????文件????????3098??2006-03-17?16:43??Compiler\TypeDef.h

評論

共有 條評論