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);
    }
  • 相关阅读:
    杨辉三角形
    open live writer
    已加载"C:WindowsSysWOW64msvcp120d.dll".无法查找或打开 PDB 文件.
    4.标准信号与槽
    python的单元测试unittest(一)
    python面向对象--类与对象
    python的文件操作与目录操作os模块
    Jenkins的安装与配置
    selenium切换到iframe
    selenium对富文本的操作
  • 原文地址:https://www.cnblogs.com/zjsthunder/p/11791886.html
Copyright © 2011-2022 走看看