extern "C"
{
int yyparse(void);
int yylex(void);
int yywrap()
{
return 1;
}
}
extern int yydebug;
main()
{
yydebug=1;
yyparse();
}
statement:
expression
| VARIABLE '=' expression
;
expression: INTEGER
|
VARIABLE
|
exp '+' exp
|
exp '-' exp
|
exp '*' exp
|
exp '/' exp
| '(' expression ')'
;
operators_punctuation: '+'
| '-'
| '*'
| '('
| ')'
| ','
| ';'
| '='
| '/'
| '%'
| '||'
| '|'
| '&&'
| '&'
;
%{
#define PLUS 1
#define MINUS 2
// ...
#define K_IF 100
#define K_ELSE 101
%}
%{
#define COMMENT 1
#define VARIABLE 2
#define INTEGER 3
#define FLOAT 4
#define STRING 5
#define K_IF 6
#define K_ELSE 7
#define K_WHILE 8
#define K_INT 9
#define K_VOID 10
#define K_RETURN 11
#define K_FLOAT 12
#define PLUS 13
#define MINUS 14
#define TIMES 15
#define SLASH 16
#define LPAREN 17
#define RPAREN 18
#define SEMICOLON 19
#define COMMA 20
#define EQL 21
#define OR 22
#define OR2 23
#define AND 24
#define AND2 25
%}
LETTER [a-zA-Z_]
DIGIT [0-9]
LETTERDIGIT [a-zA-Z0-9_]
SIGN [-+]
STRINGCONSTANT \"[^"\n]*["\n]
CHARCONSTANT \'[^'\n]*\'
RANKSPEC \[[,]*\]
INTEGER {digit}+
VARIABLE [a-z_]({LETTERDIGIT})*
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return SLASH; }
"(" { return LPAREN; }
")" { return RPAREN; }
";" { return SEMICOLON; }
"," { return COMMA; }
"=" { return EQL; }
"|" { return OR; }
"||" { return OR2; }
"&" { return AND; }
"&&" { return AND2; }
"if" { return K_IF; }
"else" { return K_ELSE; }
"do" { return K_DO; }
"int" { return K_INT; }
"return" { return K_RETURN; }
"void" { return K_VOID; }
"float" { return K_FLOAT; }
"while" { return WHILESYM; }
{LETTER}{LETTERDIGIT}* {
yylval.id = new Identifier(yytext);
yylval.id->line = line;
return(IDENTIFIER);
}
{VARIABLE}* {
yylval.lit = new Liter(yytext);
yylval.lit->type = t_var;
return(LITERAL);
}
{SIGN}?{DIGIT}+"."{DIGIT}+ {
yylval.lit = new Literal(yytext);
yylval.lit->type = t_float;
return(LITERAL);
}
{SIGN}?{DIGIT}+ {
yylval.lit = new Literal(yytext);
yylval.lit->type = t_int32;
return(LITERAL);
}
{STRINGCONSTANT} {
yylval.lit = new Literal(yytext);
yylval.lit->type = t_string;
return(LITERAL);
}
[ \t\n\r] /* skip whitespace */
. { printf("Unknown character [%c]\n",yytext[0]);
return UNKNOWN; }
%%
int yywrap(void){return 1;}
{LETTER}{LETTERDIGIT}* {
yylval.id = new Identifier(yytext); <-- REMOVE LINE
yylval.id->line = line; <-- REMOVE LINE
return(IDENTIFIER);
}
{VARIABLE}* {
yylval.lit = new Liter(yytext); <-- REMOVE LINE
yylval.lit->type = t_var; <-- REMOVE LINE
return(LITERAL);
}
{SIGN}?{DIGIT}+"."{DIGIT}+ {
yylval.lit = new Literal(yytext); <-- REMOVE LINE
yylval.lit->type = t_float; <-- REMOVE LINE
return(LITERAL);
}
{SIGN}?{DIGIT}+ {
yylval.lit = new Literal(yytext); <-- REMOVE LINE
yylval.lit->type = t_int32; <-- REMOVE LINE
return(LITERAL);
}
{STRINGCONSTANT} {
yylval.lit = new Literal(yytext); <-- REMOVE LINE
yylval.lit->type = t_string; <-- REMOVE LINE
return(LITERAL);
}
%{
#define COMMENT 1
#define VARIABLE 2
#define INTEGER 3
#define FLOAT 4
#define STRING 5
#define K_IF 6
#define K_ELSE 7
#define K_WHILE 8
#define K_INT 9
#define K_VOID 10
#define K_RETURN 11
#define K_FLOAT 12
#define PLUS 13
#define MINUS 14
#define TIMES 15
#define SLASH 16
#define LPAREN 17
#define RPAREN 18
#define SEMICOLON 19
#define COMMA 20
#define EQL 21
#define OR 22
#define OR2 23
#define AND 24
#define AND2 25
#define LITERAL 26
#define IDENTIFIER 27
%}
LETTER [a-zA-Z_]
DIGIT [0-9]
LETTERDIGIT [a-zA-Z0-9_]
SIGN [-+]
STRINGCONSTANT \"[^"\n]*["\n]
CHARCONSTANT \'[^'\n]*\'
RANKSPEC \[[,]*\]
INTEGER {digit}+
VARIABLE [a-z_]({LETTERDIGIT})*
COMMENT "/*""/"*([^*/]|[^*]"/"|"*"[^/])*"*"*"*/"
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return SLASH; }
"(" { return LPAREN; }
")" { return RPAREN; }
";" { return SEMICOLON; }
"," { return COMMA; }
"=" { return EQL; }
"|" { return OR; }
"||" { return OR2; }
"&" { return AND; }
"&&" { return AND2; }
"if" { return K_IF; }
"else" { return K_ELSE; }
"do" { return K_DO; }
"int" { return K_INT; }
"return" { return K_RETURN; }
"void" { return K_VOID; }
"float" { return K_FLOAT; }
"while" { return WHILESYM; }
{LETTER}{LETTERDIGIT}* {
yylval.id = new Identifier(yytext);
yylval.id->line = line;
return(IDENTIFIER);
}
{VARIABLE}* {
yylval.lit = new Liter(yytext);
yylval.lit->type = t_var;
return(LITERAL);
}
{COMMENT} {
yylval.lit = new Liter(yytext);
yylval.lit->type = t_comment;
return(LITERAL);
}
{SIGN}?{DIGIT}+"."{DIGIT}+ {
yylval.lit = new Literal(yytext);
yylval.lit->type = t_float;
return(LITERAL);
}
{SIGN}?{DIGIT}+ {
yylval.lit = new Literal(yytext);
yylval.lit->type = t_int32;
return(LITERAL);
}
{STRINGCONSTANT} {
yylval.lit = new Literal(yytext);
yylval.lit->type = t_string;
return(LITERAL);
}
[ \t\n\r] /* skip whitespace */
. { printf("Unknown character [%c]\n",yytext[0]);
return UNKNOWN; }
%%
int main(void){
int token;
while(token = yylex()) {
printf("lexed token: %d\n", token);
}
int yywrap(void){return 1;}
%{
#define COMMENT 1
#define VARIABLE 2
#define INTEGER 3
#define FLOAT 4
#define STRING 5
#define K_IF 6
#define K_ELSE 7
#define K_WHILE 8
#define K_INT 9
#define K_VOID 10
#define K_RETURN 11
#define K_FLOAT 12
#define PLUS 13
#define MINUS 14
#define TIMES 15
#define SLASH 16
#define LPAREN 17
#define RPAREN 18
#define SEMICOLON 19
#define COMMA 20
#define EQL 21
#define OR 22
#define OR2 23
#define AND 24
#define AND2 25
#define LITERAL 26
#define IDENTIFIER 27
%}
LETTER [a-zA-Z_]
DIGIT [0-9]
LETTERDIGIT [a-zA-Z0-9_]
SIGN [-+]
STRINGCONSTANT \"[^"\n]*["\n]
CHARCONSTANT \'[^'\n]*\'
RANKSPEC \[[,]*\]
INTEGER {digit}+
VARIABLE [a-z_]({LETTERDIGIT})*
COMMENT "/*""/"*([^*/]|[^*]"/"|"*"[^/])*"*"*"*/"
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return SLASH; }
"(" { return LPAREN; }
")" { return RPAREN; }
";" { return SEMICOLON; }
"," { return COMMA; }
"=" { return EQL; }
"|" { return OR; }
"||" { return OR2; }
"&" { return AND; }
"&&" { return AND2; }
"if" { return K_IF; }
"else" { return K_ELSE; }
"do" { return K_DO; }
"int" { return K_INT; }
"return" { return K_RETURN; }
"void" { return K_VOID; }
"float" { return K_FLOAT; }
"while" { return WHILESYM; }
{LETTER}{LETTERDIGIT}* {
return(IDENTIFIER);
}
{VARIABLE}* {
return(LITERAL);
}
{COMMENT} {
return(LITERAL);
}
{SIGN}?{DIGIT}+"."{DIGIT}+ {
return(LITERAL);
}
{SIGN}?{DIGIT}+ {
return(LITERAL);
}
{STRINGCONSTANT} {
return(LITERAL);
}
[ \t\n\r] /* skip whitespace */
. { printf("Unknown character [%c]\n",yytext[0]);
return UNKNOWN; }
%%
int main(void){
int token;
while(token = yylex()) {
printf("lexed token: %d\n", token);
}
int yywrap(void){return 1;}
%{
#define COMMENT 1
#define VARIABLE 2
#define INTEGER 3
#define FLOAT 4
#define STRING 5
#define T_IF 6
#define T_ELSE 7
#define T_WHILE 8
#define T_INT 9
#define T_VOID 10
#define T_RETURN 11
#define T_FLOAT 12
#define PLUS 13
#define MINUS 14
#define TIMES 15
#define SLASH 16
#define LPAREN 17
#define RPAREN 18
#define SEMICOLON 19
#define COMMA 20
#define EQL 21
#define OR 22
#define OR2 23
#define AND 24
#define AND2 25
#define LITERAL 26
#define IDENTIFIER 27
%}
LETTER [a-zA-Z_]
DIGIT [0-9]
LETTERDIGIT [a-zA-Z0-9_]
SIGN [-+]
STRINGCONSTANT \"[^"\n]*["\n]
CHARCONSTANT \'[^'\n]*\'
RANKSPEC \[[,]*\]
INTEGER {digit}+
VARIABLE [a-z_]({LETTERDIGIT})*
COMMENT "/*""/"*([^*/]|[^*]"/"|"*"[^/])*"*"*"*/"
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return SLASH; }
"(" { return LPAREN; }
")" { return RPAREN; }
";" { return SEMICOLON; }
"," { return COMMA; }
"=" { return EQL; }
"|" { return OR; }
"||" { return OR2; }
"&" { return AND; }
"&&" { return AND2; }
"if" { return T_IF; }
"else" { return T_ELSE; }
"do" { return T_DO; }
"int" { return T_INT; }
"return" { return T_RETURN; }
"void" { return T_VOID; }
"float" { return T_FLOAT; }
"while" { return T_WHILE; }
{LETTER}{LETTERDIGIT}* {
return(IDENTIFIER);
}
{VARIABLE}* {
printf("VARIABLE\n"); yylval.lexeme=(char*)malloc(yyleng+1);
strcpy(yyval.lexeme, yytext);
/*return T_VARIABLE*/
return(LITERAL);
}
{COMMENT} {
return(LITERAL);
}
{SIGN}?{DIGIT}+"."{DIGIT}+ {
printf("FLOAT\n"); sscanf(yytext,"%d", &(yyval.value));
return(LITERAL);
}
{SIGN}?{DIGIT}+ {
printf("INTEGER\n"); sscanf(yytext,"%d", &(yyval.value));
return(LITERAL);
}
{STRINGCONSTANT} {
return(LITERAL);
}
[ \t\n\r] /* skip whitespace */
. { printf("Unknown character [%c]\n",yytext[0]);
return UNKNOWN; }
%%
int main(void){
int token;
while(token = yylex()) {
printf("lexed token: %d\n", token);
}
int yywrap(void){return 1;}
%{
#define COMMENT 1
#define VARIABLE 2
#define INTEGER 3
#define FLOAT 4
#define STRING 5
#define T_IF 6
#define T_ELSE 7
#define T_WHILE 8
#define T_INT 9
#define T_VOID 10
#define T_RETURN 11
#define T_FLOAT 12
#define PLUS 13
#define MINUS 14
#define TIMES 15
#define SLASH 16
#define LPAREN 17
#define RPAREN 18
#define SEMICOLON 19
#define COMMA 20
#define EQL 21
#define OR 22
#define OR2 23
#define AND 24
#define AND2 25
#define LITERAL 26
#define IDENTIFIER 27
%}
LETTER [a-zA-Z_]
DIGIT [0-9]
LETTERDIGIT [a-zA-Z0-9_]
SIGN [-+]
STRINGCONSTANT \"[^"\n]*["\n]
CHARCONSTANT \'[^'\n]*\'
RANKSPEC \[[,]*\]
INTEGER {digit}+
VARIABLE [a-z_]({LETTERDIGIT})*
COMMENT "/*""/"*([^*/]|[^*]"/"|"*"[^/])*"*"*"*/"
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return SLASH; }
"(" { return LPAREN; }
")" { return RPAREN; }
";" { return SEMICOLON; }
"," { return COMMA; }
"=" { return EQL; }
"|" { return OR; }
"||" { return OR2; }
"&" { return AND; }
"&&" { return AND2; }
"if" { return T_IF; }
"else" { return T_ELSE; }
"do" { return T_DO; }
"int" { return T_INT; }
"return" { return T_RETURN; }
"void" { return T_VOID; }
"float" { return T_FLOAT; }
"while" { return T_WHILE; }
{LETTER}{LETTERDIGIT}* {
return(IDENTIFIER);
}
{VARIABLE}* {
printf("VARIABLE\n"); yylval.lexeme=(char*)malloc(yyleng+1);
strcpy(yyval.lexeme, yytext);
/*return T_VARIABLE*/
return(LITERAL);
}
{COMMENT} {
return(LITERAL);
}
{SIGN}?{DIGIT}+"."{DIGIT}+ {
printf("FLOAT\n"); sscanf(yytext,"%d", &(yyval.value));
return(LITERAL);
}
{SIGN}?{DIGIT}+ {
printf("INTEGER\n"); sscanf(yytext,"%d", &(yyval.value));
return(LITERAL);
}
{STRINGCONSTANT} {
return(LITERAL);
}
[ \t\n\r] /* skip whitespace */
. { printf("Unknown character [%c]\n",yytext[0]);
return UNKNOWN; }
%%
int main(void){
int token;
while(token = yylex()) {
printf("lexed token: %d\n", token);
}
}
int yywrap(void){
return 1;
}
You have:
LETTER [a-zA-Z_]
DIGIT [0-9]
Fix as:
LETTER [a-zA-Z_]
DIGIT [0-9]
You have:
{LETTER}{LETTERDIGIT}* {
return(IDENTIFIER);
}
Fix as:
{LETTER}{LETTERDIGIT}* {
return(IDENTIFIER);
}
%{
#define COMMENT 1
#define VARIABLE 2
#define INTEGER 3
#define FLOAT 4
#define STRING 5
#define T_IF 6
#define T_ELSE 7
#define T_WHILE 8
#define T_INT 9
#define T_VOID 10
#define T_DO 11
#define T_RETURN 12
#define T_FLOAT 13
#define PLUS 14
#define MINUS 15
#define TIMES 16
#define SLASH 17
#define LPAREN 18
#define RPAREN 19
#define SEMICOLON 20
#define COMMA 21
#define EQL 22
#define OR 23
#define OR2 24
#define AND 25
#define AND2 26
#define LITERAL 27
#define IDENTIFIER 28
#define UNKNOWN 29
%}
LETTER [a-zA-Z_]
DIGIT [0-9]
LETTERDIGIT [a-zA-Z0-9_]
SIGN [-+]
STRINGCONSTANT \"[^"\n]*["\n]
CHARCONSTANT \'[^'\n]*\'
RANKSPEC \[[,]*\]
INTEGER {digit}+
VARIABLE [a-z_]({LETTERDIGIT})*
COMMENT "/*""/"*([^*/]|[^*]"/"|"*"[^/])*"*"*"*/"
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return SLASH; }
"(" { return LPAREN; }
")" { return RPAREN; }
";" { return SEMICOLON; }
"," { return COMMA; }
"=" { return EQL; }
"|" { return OR; }
"||" { return OR2; }
"&" { return AND; }
"&&" { return AND2; }
"if" { return T_IF; }
"else" { return T_ELSE; }
"do" { return T_DO; }
"int" { return T_INT; }
"return" { return T_RETURN; }
"void" { return T_VOID; }
"float" { return T_FLOAT; }
"while" { return T_WHILE; }
{LETTER}{LETTERDIGIT}* {
return(IDENTIFIER);
}
{VARIABLE}* {
printf("VARIABLE\n"); yylval.lexeme=(char*)malloc(yyleng+1);
strcpy(yyval.lexeme, yytext);
/*return T_VARIABLE*/
return(LITERAL);
}
{COMMENT} {
return(LITERAL);
}
{SIGN}?{DIGIT}+"."{DIGIT}+ {
printf("FLOAT\n"); sscanf(yytext,"%d", &(yyval.value));
return(LITERAL);
}
{SIGN}?{DIGIT}+ {
printf("INTEGER\n"); sscanf(yytext,"%d", &(yyval.value));
return(LITERAL);
}
{STRINGCONSTANT} {
return(LITERAL);
}
[ \t\n\r] /* skip whitespace */
. { printf("Unknown character [%c]\n",yytext[0]);
return UNKNOWN; }
%%
int main(void){
int token;
while(token = yylex()) {
printf("lexed token: %d\n", token);
}
}
%%
int yywrap(void){
return 1;
}
%{
#define COMMENT 1
#define VARIABLE 2
#define INTEGER 3
#define FLOAT 4
#define STRING 5
#define T_IF 6
#define T_ELSE 7
#define T_WHILE 8
#define T_INT 9
#define T_VOID 10
#define T_DO 11
#define T_RETURN 12
#define T_FLOAT 13
#define PLUS 14
#define MINUS 15
#define TIMES 16
#define SLASH 17
#define LPAREN 18
#define RPAREN 19
#define SEMICOLON 20
#define COMMA 21
#define EQL 22
#define OR 23
#define OR2 24
#define AND 25
#define AND2 26
#define LITERAL 27
#define IDENTIFIER 28
#define UNKNOWN 29
%}
LETTER [a-zA-Z_]
DIGIT [0-9]
LETTERDIGIT [a-zA-Z0-9_]
SIGN [-+]
STRINGCONSTANT \"[^"\n]*["\n]
CHARCONSTANT \'[^'\n]*\'
RANKSPEC \[[,]*\]
INTEGER {digit}+
VARIABLE [a-z_]({LETTERDIGIT})*
COMMENT "/*""/"*([^*/]|[^*]"/"|"*"[^/])*"*"*"*/"
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return SLASH; }
"(" { return LPAREN; }
")" { return RPAREN; }
";" { return SEMICOLON; }
"," { return COMMA; }
"=" { return EQL; }
"|" { return OR; }
"||" { return OR2; }
"&" { return AND; }
"&&" { return AND2; }
"if" { return T_IF; }
"else" { return T_ELSE; }
"do" { return T_DO; }
"int" { return T_INT; }
"return" { return T_RETURN; }
"void" { return T_VOID; }
"float" { return T_FLOAT; }
"while" { return T_WHILE; }
{LETTER}{LETTERDIGIT}* {
return(IDENTIFIER);
}
{VARIABLE}* {
// printf("VARIABLE\n"); yylval.lexeme=(char*)malloc(yyleng+1);
// strcpy(yyval.lexeme, yytext);
/*return T_VARIABLE*/
return(LITERAL);
}
{COMMENT} {
return(LITERAL);
}
{SIGN}?{DIGIT}+"."{DIGIT}+ {
// printf("FLOAT\n");sscanf(yytext,"%d", &(yyval.value));
return(LITERAL);
}
{SIGN}?{DIGIT}+ {
// printf("INTEGER\n"); sscanf(yytext,"%d", &(yyval.value));
return(LITERAL);
}
{STRINGCONSTANT} {
return(LITERAL);
}
[ \t\n\r] /* skip whitespace */
. { printf("Unknown character [%c]\n",yytext[0]);
return UNKNOWN; }
%%
int main(void){
int token;
while(token = yylex()) {
printf("lexed token: %d\n", token);
}
}
%%
int yywrap(void){return 1;}
Open in new window