Program a programming language - lesson 3
From ThorstensHome
You are here: Main Page -> My Tutorials -> Programming Tutorials -> How to program your own programming language -> Lesson 3
Our programming language in the third lesson can already understand
print 2+2
or
wait 2+2
a program can only consist of one instruction. The parameter of wait is how many seconds the system will wait ("sleep").
example.lex
%{ #include <stdio.h> #include "y.tab.h" extern YYSTYPE yylval; %} %% [0123456789]+ yylval=atoi(yytext); return NUMBER; [a-zA-Z][a-zA-Z0-9]* yylval=yytext; return COMMAND; [\+\-\*\/] return OPERATOR; %%
example.y
%{ #include <stdio.h> #include <string.h> void yyerror(const char *str) { fprintf(stderr,"error: %s\n",str); } int yywrap() { return 1; } main() { yyparse(); } %} %token NUMBER OPERATOR COMMAND %left OPERATOR %% instruction: | command_expression ; expression: NUMBER {$$=$1;} | NUMBER OPERATOR NUMBER { $$=$1+$3; } ; command: COMMAND {$$=$1; if (!strcmp((char*) $1,"print")) { $$="print"; } if (!strcmp((char*) $1,"wait")) { $$="wait"; } } ; command_expression: command expression { if (!strcmp((char*) $1,"print")) printf("%i",$2); if (!strcmp((char*) $1,"wait")) { sleep $2*1000000; printf("waited"); } } ; %%
compile and run it
lex example.lex && yacc -d example.y && cc lex.yy.c y.tab.c -o example && ./example ... print 2+2 4