摘要: 1、简单C语言的词法分析程序;%{#include<stdio.h>#include<stdlib.h>#include<ctype.h>#include<string.h>%}digit[0-9]letter[A-Za-z]other_char[!-@\[-~]id({letter}|[_])({letter}|{digit}|[_])*string{({letter}|{digit}|{other_char})+}int_num{digit}+%%[ |\t|\n]+"auto"|"double"|&q 阅读全文
posted @ 2011-11-21 09:48 beishuai 阅读(3531) 评论(1) 推荐(2) 编辑
摘要: 2.4.3 yacc解决二义性和冲突的方法在2.3.8中已涉及到二义性和冲突的问题,这里再集中介绍一下,这在写Yacc源程序时会经常碰到。二义性会带来冲突。在2.3.8中我们介绍了yacc可以用为算符确定优先级和结合规则解决由二义性造成的冲突,但是有一些由二义性造成的冲突不易通过优先级方法解决,如有名的例子:stat:IF bexp THEN stat|IF bexp THEN stat ELSEstat;对于这样的二义性造成的冲突和一些不是由二义性造成的冲突,Yacc提供了下面两条消除二义性的规则:A1.出现移进/归约冲突时,进行移进;A2. 出现归约/归约冲突时,按照产生式在yacc源程序 阅读全文
posted @ 2011-11-21 09:46 beishuai 阅读(3372) 评论(0) 推荐(2) 编辑
摘要: 二、语法分析程序自动产生器yacc的使用方法2.l yacc概述形式语言都有严格定义的语法结构,我们对它们进行处理时首先要分析其语法结构。yace是一个语法分析程序的自动产生器,严格地说Lex也是一个形式语言的语法分析程序的自动产生器。不过Lex所能处理的语言仅限于正规语言,而高级语言的词法结构恰好可用正规式表示,因此Lex只是一个词法分析程序的产生器。yace可以处理能用LALR(1)文法表示的上下文无关语言。而且我们将会看到yace具有一定的解决语法的二义性的功能。yacc的用途很广,但主要用于程序设计语言的编译程序的自动构造上。例如可移植的C语言的编译程序就是用yacc来写的。还有许多数 阅读全文
posted @ 2011-11-21 09:45 beishuai 阅读(2525) 评论(0) 推荐(2) 编辑
摘要: Lex自动地表示把输入串词法结构的正规式及相应的动作转换成一个宿主语言的程序,即词法分析程序,它有一个固定的名字yyler,在这里yyler是一个C语言的程序。Yylex将识别出输入串中的词形,并且在识别出某词形时完成指定的动作。看一个简单的例子:写一个lex源程序,将输入串中的小写字母转换成相应的大定字母。程序如下:%%[a-z]printf(“%c”.yytext[0]+'A'-'a');上述程序中的第一行%%是一个分界符,表示识别规则的开始。第二行就是识别规则。左边是识别小写字母的正规式。右边就是识别出小写字母时采取的动作:将小写字母转换成相应的大写字母。 阅读全文
posted @ 2011-11-21 09:43 beishuai 阅读(2542) 评论(0) 推荐(1) 编辑