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);
    }
  • 相关阅读:
    关于HTTP以及TCP
    .NetCore表单提交文件
    C# Out变量
    .NET Core 网络数据采集 -- 使用AngleSharp做html解析
    C# 根据Url下载文件/获取文件流
    C# 模拟表单提交
    C# 获取Url路径的参数信息
    C# 采集页面数据
    .net core 3.1 设置可跨域
    C# json字符串转化成Dictionary
  • 原文地址:https://www.cnblogs.com/zjsthunder/p/11791886.html
Copyright © 2011-2022 走看看