I can use this very nicely but in the expr i want to validate the expr tADD
etc i created, but i can not access the expr
inside operation, how do i access it ? it just returns the result that is 0
%{
#include <stdio.h>
void yyerror (const char *s)
#define YYSTYPE char *
extern YYSTYPE yylval;
extern int line;
{}
%}
%token tADD tSUB tMUL tDIV tSTRING tNUM tPRINT tGET tSET tFUNCTION tRETURN tIDENT tEQUALITY tIF tGT tLT tGEQ tLEQ tINC tDEC
%start prog
%%
prog: '[' stmtlst ']'
;
stmtlst: stmtlst stmt |
;
stmt: setStmt | if | print | unaryOperation | expr | returnStmt
;
getExpr: '[' tGET ',' tIDENT ',' '[' exprList ']' ']'
| '[' tGET ',' tIDENT ',' '[' ']' ']'
| '[' tGET ',' tIDENT ']'
;
setStmt: '[' tSET ',' tIDENT ',' expr ']'
;
if: '[' tIF ',' condition ',' '[' stmtlst ']' ']'
| '[' tIF ',' condition ',' '[' stmtlst ']' '[' stmtlst ']' ']'
;
print: '[' tPRINT ',' '[' expr ']' ']'
;
operation: '[' tADD ',' expr ',' expr ']' {
if($2){
printf("op\n");
}
printf("%d here ", $4);
}
| '[' tSUB ',' expr ',' expr ']'
| '[' tMUL ',' expr ',' expr ']'
| '[' tDIV ',' expr ',' expr ']'
;
unaryOperation: '[' tINC ',' tIDENT ']'
| '[' tDEC ',' tIDENT ']'
;
expr: tNUM | tSTRING | function | operation | condition
;
function: '[' tFUNCTION ',' '[' parametersList ']' ',' '[' stmtlst ']' ']'
| '[' tFUNCTION ',' '[' ']' ',' '[' stmtlst ']' ']'
;
condition: '[' tEQUALITY ',' expr ',' expr ']'
| '[' tGT ',' expr ',' expr ']'
| '[' tLT ',' expr ',' expr ']'
| '[' tGEQ ',' expr ',' expr ']'
| '[' tLEQ ',' expr ',' expr ']'
;
returnStmt: '[' tRETURN ',' expr ']'
| '[' tRETURN ']'
;
parametersList: parametersList ',' tIDENT | tIDENT
;
exprList: exprList ',' expr | expr{
printf("%s\n", $1);
}
;
%%
int main ()
{
if (yyparse()) {
// parse error
printf("ERROR\n");
return 1;
}
else {
// successful parsing
printf("OK\n");
return 0;
}
}
I use $4
but I always get 0
as the value for all Operations,
expr: tNUM | tSTRING | function | operation | condition
;
Also flex that i use
%{
#include "username-hw3.tab.h"
%}
%%
['][^']*['] return tSTRING;
["]Get["] return tGET;
["]Set["] return tSET;
["]Function["] return tFUNCTION;
["]Print["] return tPRINT;
["]If["] return tIF;
["]Return["] return tRETURN;
["]"+"["] return tADD;
["]"-"["] return tSUB;
["]"*"["] return tMUL;
["]"/"["] return tDIV;
["]"++"["] return tINC;
["]">"["] return tGT;
["]"=="["] return tEQUALITY;
["]"--"["] return tDEC;
["]"<"["] return tLT;
["]"<="["] return tLEQ;
["]">="["] return tGEQ;
["][_a-zA-Z][a-zA-Z0-9_]*["] return tIDENT;
[0-9]+ |
-[0-9]+ |
[0-9]+"."[0-9]+ |
-[0-9]+"."[0-9]+ return tNUM;
[ \t\n]+
. return yytext[0];
%%