zoukankan      html  css  js  c++  java
  • x01.calc: 编程语言

    想写终极程序,大都去写操作系统或编程语言了。编程语言可以极其复杂如C,也可以极简,只处理加减乘除如 calc。

    1. 词法分析

    %{
    #include <stdio.h>
    #include "y.tab.h"
    
    int
    yywrap(void)
    {
        return 1;
    }
    %}
    %%
    "+"             return ADD;
    "-"             return SUB;
    "*"             return MUL;
    "/"             return DIV;
    "
    "            return CR;
    ([1-9][0-9]*)|0|([0-9]+.[0-9]*) {
        double temp;
        sscanf(yytext, "%lf", &temp);
        yylval.double_value = temp;
        return DOUBLE_LITERAL;
    }
    [ 	] ;
    . {
        fprintf(stderr, "lexical error.
    ");
        exit(1);
    }
    %%
    calc.l

    2,语法分析

    %{
    #include <stdio.h>
    #include <stdlib.h>
    #define YYDEBUG 1
    %}
    %union {
        int          int_value;
        double       double_value;
    }
    %token <double_value>      DOUBLE_LITERAL
    %token ADD SUB MUL DIV CR
    %type <double_value> expression term primary_expression
    %%
    line_list
        : line
        | line_list line
        ;
    line
        : expression CR
        {
            printf(">>%lf
    ", $1);
        }
    expression
        : term
        | expression ADD term
        {
            $$ = $1 + $3;
        }
        | expression SUB term
        {
            $$ = $1 - $3;
        }
        ;
    term
        : primary_expression
        | term MUL primary_expression 
        {
            $$ = $1 * $3;
        }
        | term DIV primary_expression
        {
            $$ = $1 / $3;
        }
        ;
    primary_expression
        : DOUBLE_LITERAL
        ;                 
    %%
    int
    yyerror(char const *str)
    {
        extern char *yytext;
        fprintf(stderr, "parser error near %s
    ", yytext);
        return 0;
    }
    
    int main(void)
    {
        extern int yyparse(void);
        extern FILE *yyin;
    
        yyin = stdin;
        if (yyparse()) {
            fprintf(stderr, "Error ! Error ! Error !
    ");
            exit(1);
        }
    }
    calc.y

    运行如下命令,即可生成一个简单的 calc:

    yacc -dv calc.y
    lex calc.l
    cc -o calc y.tab.c lex.yy.c

    更多内容,可网上搜索《自制编程语言》进行学习。

  • 相关阅读:
    【转】P2P通信原理与实现(C++)
    【转】P2P通信标准协议(二)之TURN
    【转】P2P之UDP穿透NAT的原理与实现
    【转】P2P的原理和常见的实现方式
    【转】linux中man使用技巧
    【转】go编译时,加入svn版本信息
    各种移动GPU压缩纹理的使用方法
    Unity贴图压缩格式设置
    关于U3D贴图格式压缩
    可能会导致.NET内存泄露的8种行为
  • 原文地址:https://www.cnblogs.com/china_x01/p/10425424.html
Copyright © 2011-2022 走看看