Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // calc-ad.l:
- integer [0-9]+
- variable [a-zA-Z]
- %{
- #include <stdio.h>
- #include "y.tab.h"
- void yyerror(char *msg, ...);
- %}
- %%
- {integer} { yylval.num = atoi(yytext); return INTEGER; }
- {variable} { yylval.var = yytext[0]; return VARIABLE; }
- [+*()=;\n] { return yytext[0]; }
- [ \t] { }
- %%
- int yywrap() {
- return 1;
- }
- // calc.y:
- %{
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdarg.h>
- int yylex(void);
- void yyerror(char *msg, ...);
- void setvalue(char var, int val);
- int getvalue(char var);
- int symbol_table[52] = {0};
- int declared[52] = {0};
- %}
- %union { char var; int num; }
- %start statements
- %token <num> INTEGER
- %token <var> VARIABLE
- %type <num> E T F
- %%
- statements :
- statements statement '\n'
- |
- ;
- statement :
- E ';' { printf("Value of expression: %d\n", $1); }
- | VARIABLE '=' E ';' { setvalue($1, $3); printf("Value %d assigned to %c\n", $3, $1); }
- ;
- E :
- E '+' T { $$ = $1 + $3; }
- | T
- ;
- T :
- T '*' F { $$ = $1 * $3; }
- | F
- ;
- F :
- INTEGER
- | VARIABLE { $$ = getvalue($1); }
- | '(' E ')' { $$ = $2; }
- ;
- %%
- void yyerror(char *fmt, ...) {
- va_list args;
- fprintf(stderr, "Error: ");
- va_start(args, fmt);
- vfprintf(stderr, fmt, args);
- va_end(args);
- fprintf(stderr, "\n");
- }
- int getidx(char var) {
- if(var >= 'a' && var <= 'z')
- return var - 'a';
- else if(var >= 'A' && var <= 'Z')
- return var - 'A' + 26;
- return -1;
- }
- void setvalue(char var, int val) {
- int idx = getidx(var);
- if(idx == -1) {
- exit(EXIT_FAILURE);
- }
- declared[idx] = 1;
- symbol_table[idx] = val;
- }
- int getvalue(char var) {
- int idx = getidx(var);
- if(idx == -1) {
- exit(EXIT_FAILURE);
- }
- if(!declared[idx]) {
- yyerror("variable %c not declared", var);
- exit(EXIT_FAILURE);
- }
- return symbol_table[idx];
- }
- int main()
- {
- yyparse();
- return 0;
- }
Advertisement
Comments
-
- Blog at: https://syedumair327.blogspot.com/2025/10/building-compiler-part-2-of-4-getting.html
Add Comment
Please, Sign In to add comment