关于lex与yacc的学习使用(不定期更新)

最近正在学习编译原理,自己学习总结了一些内容

关于lex与yacc工具的使用在linux上:

Lex工具是一种词法分析程序生成器,它可以根据词法规则说明书的要求来生成单词识别程序,由该程序识别出输入文本中的各个单词。
lex程序的规则:定义部分;规则部分;用户子程序部分(其中规则部分是必须的,定义和用户子程序部分是任选的)

ep:

$vi      lex.l     //产生的C语言程序为lex.yy.c

%{

/* need this for the call to atof() below */
#include <math.h>
%}
DIGIT    [0-9]
ID       [a-z][a-z0-9]*
%%
{DIGIT}+    {
    printf( "An integer: %s (%d)\n", yytext,
            atoi( yytext ) );
            }
{DIGIT}+"."{DIGIT}*     {
    printf( "A float: %s (%g)\n", yytext,
            atof( 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 );
"{"[\^{}}\n]*"}"    /* eat up one-line comments */
[ \t\n]+    /* eat up whitespace */
.   printf( "Unrecognized character: %s\n", yytext );
%%
int main(int argc, const char *argv[])
{
    ++argv, --argc;  /* skip over program name */
    if ( argc > 0 )
        yyin = fopen( argv[0], "r" );
    else
        yyin = stdin;
    yylex();
    return 0;
}

 

$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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值