词法分析编译器工作第阶段工作输入(源代码)中取token作parser(语法分析)输入般词法分析阶段会空白字符(white space空格tab换行)注释剔降低步分析复杂度词法分析器般会提供gettoken()样方法parser做语法分析时调词法分析器方法token词法分析器次性遍历源代码采取种ondemand方式:parser需时工作次取token
tokenlexeme
首先token等lexemetokenlexeme关系类似面象语言中类实例(象)间关系中文知该解释语言中变量ab属种token:identifieralexemeabb关键字种tokentoken附带值属性例变量a调词法分析器gettoken()时会返回identifier类型tokentoken带属性a属性样例表示数字token带表示数字值属性整型
代码:
int age 23
int count 50
次提取出8token:int(值int)id(值age)assign(值)number(值整型数值23)int(值int)id(值count)assign(值)number(值50)
正表达式
正表达式描述字符串模式例digit+表示numbertoken中digit表示单数字(里说正表达式完全实现正引擎识正表达式等价里描述问题已)
然c语言行注释正表达式描述较麻烦时更倾直接穷动机(finite automaton)描述描述非常直观容易
穷动机(finite automata)
穷动机称限状态机状态输入字符作发生迁移识token画出fa代码实现fa词法分析器差弄
穷动机分确定性(dfa)非确定性(nfa)两种果输入会确定状态迁移路线确定状态dfa否nfa
dfa输入确定状态词法分析器然优先采nfa干嘛呢?nfa做描述时更方便非常迅速画出识tokennfa图想直接画出dfa动少脑筋
根正表达式构建nfa
述nfa更容易画出先研究nfa定义token时正表达式描述正表达式干行合适例digit+描述数字方便
需根正表达式画出等价nfa算法非常简单tompson’s construction书写清楚
nfa转化成dfa(nfa确定化)
计算机说面输入果状态计算机清楚转状态期正表达式dfanfa样编程实现时较然(输入确定状态)幸运nfa转化成dfa什nfa转化成dfa?fa(finite automata)中状态画fa正确识tokenok果nfadfa达样效果:识token
nfa确定化质原状态改状态表示新状态实状态集nfa中状态s1输入a达s2s3dfa中s2s3合起认状态问题nfa中空转换(输入)果s1输入达s2表示s1条件转移s2s1s2然合起作dfa中状态nfa转dfa算法理解首先先定义空闭包(closure):
closure 状态sclosures转换达状态集sclosure永远会包含s身状态集closure该状态集中状态closure集合
nfa确定化算法(subset construction):
开始状态开始计算closure状态集set1然考察set1某输入a作会迁移状态状态集中起求集合closure
set2样画两圈标set1标set2然画条set1set2线两圆连起线标a样dfa部分画然考察set1输入达状态集closure样画圈连线类推时候包含原nfa中终结状态(final stateacceptin state)dfa状态(转换dfa中状态包含原nfa中状态)标记终结状态
化dfa状态数
正表达式构建出等价nfa然nfa确定化成dfa似事情搞完事实证明(时显然发现)终构成dfa似复杂状态冗余呃dfa化
化dfa状态数算法思想开始时假设完美情况整dfa两状态终结状态开始(难道种状态情况?果原dfa中存非终结状态然非终结态终结态合)然假设真算法完美假设假设进步考察果发现状态合分出吧样重复考察直发现没状态会合时做完时正优解
嗯开始非终结状态袋子包起成状态终结状态袋子包起成状态注意原dfa中状态间连线扯断然抽出中袋子考察中状态准备输入然逐出测试果该袋子中状态某输入a达状
态正袋子中说明袋子中状态目前合说果输入作袋子中状态达新状态正袋子中状态合果某输入a袋子中部分状态会转移袋子中状态叛徒假设s1s2竟然输入a会迁移袋子中状态说明s1s2转移袋子中状态合s1s2装成新袋子原袋子中分出然现假设s1s2合装起究竟真合呆会考察考察完输入a接着考察输入果考察完袋子发现状态a输入转移袋子中状态dfa合成状态a输入身状态迁移
实现词法分析器
token表示数字token:num正表达式描述然画出nfanfa转化成dfa化dfa状态词法分析器分析token类型tokendfa合成dfa样dfa识语言token果某连串输入dfa达终结状态说明源代码错误
c#实现compiler construction principles and practice中tiny语言词法分析器tiny语言关键字:if then else end repeat until read write操作符+*<()(全角逗号算文章分隔符)10然余tokennumber (数字)identifier(字母)dfa图:
面张图编译原理实践中样中带中括号输入说明输入lookahead
匹配成功重新放回输入流中识num时果发现非digit说明识number识非digit字符放回输入流留着次识
中startdoneother指非white space非{非letter非digit非字符合法+ * 合法输入#号done状态说次gettoken已结束状态机合法输入进入done状态究竟startdone合法+号导致合法#号导致代码中实现判断肯定+号#号作start状态会进入done状态
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档