词法分析器与正规式

词法分析器

词法分析器是一个程序,它的任务是从源程序中提取单词。比如从源程序中提取出保留字,标识符,常数,运算符等单词符号。

词法分析器的结果是输出单词(token),通常是二元式(单词种别,单词自身的值)。

单词种别的划分,是如何设计编译器层面上的事情。可以将所有的保留字视为一种,也可以将每个保留字都视为一种。不过通常是将每种单词视为一个整数码,这样方便处理。

单词自身的值,如果一个单词种别只包含一个单词, 那么其种别编码就是其自身的值。  对于标识符和,其在符号表的入口指针作为它自身的值。

 

状态转换图

状态转换图对于单词的识别是可行的。只要构造出相应语言的单词的状态转换图,那么单词的识别是非常容易的。

正规式

可以将状态转换图的概念加以形式化,那么就是正规式。正规式用数学语言描述了状态转换图。可以用程序对正规式构造相应的状态转换图。

那么只要将状态图加以形式化,那么就可以自动生成词法分析器。

 

转载于:https://www.cnblogs.com/beMaster/p/5066373.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理课内容,代码可读性高,关键地方都有注释 对词法分析器各函数说明: void preInit(); //初始化关键字和关键状态 void init(); //对正规文法初始化 void inputEX(string rule); //存储三型文法进入数据结构 set<char> Closure(FA nfa, char st); //对一个状态求闭包 set<char> unionSet(set<char>s1,set<char>s2); //加入闭包结果 set<char> e_move(FA nfa,char st, char ch); //使用子集法的move操作 bool equalSet(set<char> s1, set<char> s2); //使用子集法时若产生相同状态则合并 void createNFA(string express); //产生式->DFA FA createDFA(FA nfa); //NFA->DFA bool isLetter(char ch); //判断是否是数字 bool isDigit(char ch); //判断是否是字母 map<char,char> getTrans(char nowNode); //从DFA中获得转换关系 Ans runDFA(string str,int pos,int line); //启动识别源程序 对语法分析器各函数说明: void init(); //对正规文法初始化 void initVt(); //初始化所有终结符 void inputEX(string rule); //存储二型文法进入数据结构 void calFisrt(); //计算FIRST集合 void calFollow(); //计算FOLLOW集合 void calSelect(); //计算SELECT集合 int get_column(string target); //得到终结符在预测分析表的列标 int get_row(string target); //得到非终结符在预测分析表的行标 void create_table(); //建立预测分析表 void print_table(); //打印预测分析表(由于预测分析表过于庞大,在程序中被注释) vector<string> split(const string& str, const string& delim); //处理一个token void deal_tokens(); //对词法分析器得到的token表进行处理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值