zoukankan      html  css  js  c++  java
  • 从简单计算器了解词法分析和语法分析

    1、词法分析的目的

    将字符流转换为记号流,对应.l文件

    %{
        #include "calc.tab.h"  //导入的是通过.y文件生成的头文件,包含ADD、SUB、MUL等的定义,也可直接自己在这儿声明
    %}
    
    %%
    "+"    {return ADD;}
    "-"    {return SUB;}
    "*"    {return MUL;}
    "/"    {return DIV;}
    "|"    {return ABS;}
    [0-9]+    {yylval = atoi(yytext);return NUM;}
    
        {return EOL;}
    [ 	]    {}
    .    {printf("Mystery character %c
    ", *yytext);}
    
    %%
    
    /*
    main(int argc,char **argv)
    {
        int token;
        
        while(token = yylex()){
            printf("%d",token);
            if(token == NUMBER){
                printf(" = %d
    ",yylval);
            }
            else{
                printf("
    ");
            }
        }
    }*/

    2、语法分析的目的

    将词法分析输出的记号流,根据规则生成一颗语法树

    %{
    #include <stdio.h>
    int yyerror(char *s);
    int yylex();
    %}
    
    %token NUM
    %token ADD SUB MUL DIV ABS
    %token EOL
    
    %%
    start:
     | start expr EOL { printf("= %d
    > ", $2); }
     | start EOL { printf("> "); } 
    ;
    
    expr: term { $$ = $1; }
     | expr ADD term { $$ = $1 + $3; }
     | expr SUB term { $$ = $1 - $3; }
     ;
    term: factor { $$ = $1; }
     | term MUL factor { $$ = $1 * $3; }
     | term DIV factor { $$ = $1 / $3; }
     ;
    
    factor: NUM { $$ = $1; }
     ;
    %%
    
    int main(int argc, char **argv)
    {
      printf("> ");
      yyparse();
      return 0;
    }
    
    int yyerror(char *s)
    {
      fprintf(stderr, "error: %s
    ", s);
    }
  • 相关阅读:
    cookie、 Session Storage 、 Local Storage
    json 常用的方法
    ssm 框架 使用ajax异步,实现登陆
    ssm框架整合,配置文件中的配置内容
    ipv4和ipv6的区别
    分析域名的解析过程
    网络体系结构总结
    线程同步和异步
    博客目录
    [STM32H743]按键控制LED
  • 原文地址:https://www.cnblogs.com/zjsthunder/p/11791886.html
Copyright © 2011-2022 走看看