最近正在学习编译原理,自己学习总结了一些内容:
关于lex与yacc工具的使用在linux上:
Lex工具是一种词法分析程序生成器,它可以根据词法规则说明书的要求来生成单词识别程序,由该程序识别出输入文本中的各个单词。
lex程序的规则:定义部分;规则部分;用户子程序部分(其中规则部分是必须的,定义和用户子程序部分是任选的)
ep:
$vi lex.l //产生的C语言程序为lex.yy.c
printf (
"An integer: %s (%d)\n" , yytext,
|
printf (
"A float: %s (%g)\n" , yytext,
|
if |then|begin|end|procedure|function {
|
printf (
"A keyword: %s\n" , yytext );}
|
{ID} printf (
"An identifier: %s\n" , yytext );
|
"+" | "-" | "*" | "/"|"="
printf ( "An operator: %s\n" , yytext );
|
. printf (
"Unrecognized character: %s\n" , yytext );
|
int
main( int argc,
const
char *argv[]) |
yyin =
fopen ( argv[0],
"r" ); |
$cc -c lex.yy.c
$cc lex.yy.o -ll -o regn /*使用C编译程序将lex.yy.c编译成可执行程序regn */
/*使用regn来识别单词 */
$ vi testfile
x=355
y=113
p=x/y
# ./regn testfile
yacc工具是一种语法分析程序生成器,它可以将有关某种语言的语法说明书转换成相应的语法分析程序,由该程序完成对相应语言中语句的语法分析工作。
yacc程序结构
在使用yacc工具前,必须首先编写yacc程序,因为有关语法分析程序是根据yacc程序生成的。yacc程序实际上是有关语法规则的说明书,它也是由定义部分、规则部分和子程序部分组成的。yacc程序的定义部分类似于lex程序的定义部分,只是在其后可带有yacc声明,其中包括词法单词、语法变量、优先级和结合性。yacc程序的规则部分由语法规则和相应的动作组成,子程序部分可以包括在前面规则部分用到的子程序定义。接下来是main主程序,它调用yyparse子程序来对输入进行语法分析,而yyparse反复地调用yylex子程序来获得输入单词,在语法出错时可通过yyerror子程序来处理。
$vi hoc.y
$cc y.tab.c -o hoc
./hoc