Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %{
- extern int yylval;
- extern int sym[];
- extern int yyerror(char *s);
- #include "y.tab.h"
- %}
- %%
- [a-z] {
- yylval = *yytext - 'a';
- return VARIABLE;
- }
- [0-9]+ {
- yylval = atoi(yytext);
- return INTEGER;
- }
- [(),] { return *yytext; }
- ":=" return ASSIGN;
- "+" return PLUS;
- "-" return MINUS;
- "/" return DIVIDE;
- "%" return MODULO;
- "*" return TIMES;
- "<" return SMAS;
- "<=" return SMGAS;
- "==" return IS;
- "!=" return NOTIS;
- ">=" return BGGAS;
- ">" return BGAS;
- "min" return MIN;
- "max" return MAX;
- "n" return NEWLINE;
- [ t] ;
- . yyerror("Invalid character");
- %%
- int yywrap() {
- return 1;
- }
- %{
- #include <stdio.h>
- int sym[26];
- int yylex();
- int yyerror(char *s);
- %}
- %token VARIABLE ASSIGN INTEGER NEWLINE
- %left PLUS
- %left TIMES
- %left MINUS
- %left DIVIDE
- %left MODULO
- %left UMINUS
- %left UPLUS
- %left SMAS SMGAS IS NOTIS BGAS BGGAS
- %left MIN MAX
- %%
- program: program statement
- |
- ;
- statement: expr NEWLINE
- { printf("%dn", $1); }
- | VARIABLE ASSIGN expr NEWLINE
- { sym[$1] = $3; }
- ;
- expr: INTEGER { $$ = $1; }
- | VARIABLE { $$ = sym[$1]; }
- | expr PLUS expr { $$ = $1 + $3; }
- | expr TIMES expr { $$ = $1 * $3; }
- | expr MINUS expr { $$ = $1 - $3; }
- | expr DIVIDE expr { $$ = $1 / $3; }
- | expr MODULO expr { $$ = $1 % $3; }
- | '(' expr ')' { $$ = $2; }
- | MINUS expr %prec UMINUS { $$ = -$2; }
- | PLUS expr %prec UPLUS { $$ = $2; }
- | expr SMAS expr { $$ = $1 < $3; }
- | expr SMGAS expr { $$ = $1 <= $3; }
- | expr IS expr { $$ = $1 == $3; }
- | expr NOTIS expr { $$ = $1 != $3; }
- | expr BGGAS expr { $$ = $1 >= $3; }
- | expr BGAS expr { $$ = $1 > $3; }
- | MIN '(' expr ',' expr ')' { if ($3 < $5){ $$ = $3; } else if ($3 > $5){ $$ = $5; }; }
- | MAX '(' expr ',' expr ')' { if ($3 > $5){ $$ = $3; } else if ($3 < $5){ $$ = $5; }; }
- ;
- %%
- int yyerror(char *s) {
- fprintf(stderr, "%sn", s);
- return 0;
- }
- int main() {
- yyparse();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement