• 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

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

  • 相关阅读:
    通过WebRTC实现实时视频通信(三)
    通过WebRTC实现实时视频通信(二)
    通关机器学习,必须掌握的32种算法
    Github如何回退/回滚到某个版本
    Markdown语法与入门
    如何上传代码到github?
    Latex中如何设置字体颜色(3种方式)
    Package CJK Error: Invalid character code. 问题解决方法--xelatex和pdflatex编译的转换
    PyCharm快捷键
    最全PyCharm教程
  • 原文地址:https://www.cnblogs.com/china_x01/p/10425424.html
Copyright © 2020-2023  润新知