想写终极程序,大都去写操作系统或编程语言了。编程语言可以极其复杂如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); } %%
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\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.y
运行如下命令,即可生成一个简单的 calc:
yacc -dv calc.y lex calc.l cc -o calc y.tab.c lex.yy.c
更多内容,可网上搜索《自制编程语言》进行学习。
原文地址:https://www.cnblogs.com/china_x01/p/10425424.html
时间: 2024-10-24 03:59:38