x01.calc: 编程语言
程序员文章站
2023-03-09 15:39:29
想写终极程序,大都去写操作系统或编程语言了。编程语言可以极其复杂如C,也可以极简,只处理加减乘除如 calc。 1. 词法分析 %{ #include #include "y.tab.h" int yywrap(void) { return 1; } %} %% "+" retu ......
想写终极程序,大都去写操作系统或编程语言了。编程语言可以极其复杂如c,也可以极简,只处理加减乘除如 calc。
1. 词法分析
%{ #include <stdio.h> #include "y.tab.h" int yywrap(void) { return 1; } %} %% "+" return add; "-" return sub; "*" return mul; "/" return div; "\n" return cr; ([1-9][0-9]*)|0|([0-9]+\.[0-9]*) { double temp; sscanf(yytext, "%lf", &temp); yylval.double_value = temp; return double_literal; } [ \t] ; . { fprintf(stderr, "lexical error.\n"); exit(1); } %%
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\n", $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\n", yytext); return 0; } int main(void) { extern int yyparse(void); extern file *yyin; yyin = stdin; if (yyparse()) { fprintf(stderr, "error ! error ! error !\n"); exit(1); } }
运行如下命令,即可生成一个简单的 calc:
yacc -dv calc.y lex calc.l cc -o calc y.tab.c lex.yy.c
更多内容,可网上搜索《自制编程语言》进行学习。