yacc evaluate
YACC evaluate a given variable
First, make sure you have Flex, bison installed:
For installing on Ubuntu- sudo apt-get install flex bison
How to Compile and Run:
Clean and rebuild:
Plain Text
Copy
yacc -d parser.y
lex lexer.l
gcc lex.yy.c y.tab.c -o var_validator -ll
./var_validator
Assembly
Copy
---Save as lexer.l---
%{
#include "y.tab.h"
%}
%%
[a-zA-Z] { yylval = yytext[0]; return LETTER; }
[0-9] { yylval = yytext[0]; return DIGIT; }
"_" { yylval = '_'; return UNDERSCORE; }
[ \t] ; /* Ignore whitespace */
\n { return '\n'; }
. { return yytext[0]; }
%%
int yywrap() {
return 1;
}
Assembly
Copy
---Save as parser.y---
%{
#include <stdio.h>
int yylex();
void yyerror(char *);
char var_name[100];
int pos = 0;
%}
%token LETTER DIGIT UNDERSCORE
%%
input: /* empty */
| input line
;
line: variable '\n' { printf("Valid variable: %s\n", var_name); pos = 0; }
| '\n'
| error '\n' { pos = 0; yyerror(""); }
;
variable: LETTER { var_name[pos++] = $1; var_name[pos] = '\0'; }
| UNDERSCORE { var_name[pos++] = $1; var_name[pos] = '\0'; }
| variable LETTER { var_name[pos++] = $2; var_name[pos] = '\0'; }
| variable DIGIT { var_name[pos++] = $2; var_name[pos] = '\0'; }
| variable UNDERSCORE { var_name[pos++] = $2; var_name[pos] = '\0'; }
;
%%
void yyerror(char *s) {
fprintf(stderr, "Invalid variable name\n");
}
int main() {
printf("Enter variable names to validate (one per line, Ctrl+D to exit):\n");
yyparse();
return 0;
}
Plain Text
Copy
pune
Valid variable: pune
123Pune
Invalid variable 123Pune
Comments
Post a Comment