1
0

oprava chyb v gramatike.

nerozoznavalo to zaporne cisla.
oprava prekladu operatora = na == v OpenCL kode
zabudnuty not operator
teraz parser neroznova velkost pismen
This commit is contained in:
Dušan Poizl 2011-02-25 11:49:18 +01:00
parent f8ba9ba239
commit e68f5655b6
6 changed files with 899 additions and 682 deletions

@ -19,7 +19,7 @@ namespace DEVS
CDparser()
{
parser = new Parser(this);
f.open("vstup");
f.open("megarules2");
if(f.bad())cout << "nepodarilo sa otvorit" <<endl;
scanner = new Scanner(&f, &std::cout);
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -157,31 +157,33 @@ namespace DEVS {
FALSE = 270,
UNDEFB = 271,
UNDEFC = 272,
PLUS = 273,
MINUS = 274,
MUL = 275,
DIV = 276,
EXCEQV = 277,
EQVSIGN = 278,
GT = 279,
LT = 280,
GTEQV = 281,
LTEQV = 282,
COND_REAL_FUNC = 283,
PORTVALUE = 284,
SEND = 285,
CELLPOS = 286,
THISPORT = 287,
IF = 288,
IFU = 289,
CONST_FUNC = 290,
WITHOUT_PARAM_FUNC = 291,
UNARY_FUNC = 292,
BINARY_FUNC = 293,
COMA = 294,
INT = 295,
REAL = 296,
STRING = 297
MUL = 273,
DIV = 274,
EXCEQV = 275,
EQVSIGN = 276,
GT = 277,
LT = 278,
GTEQV = 279,
LTEQV = 280,
COND_REAL_FUNC = 281,
PORTVALUE = 282,
SEND = 283,
CELLPOS = 284,
THISPORT = 285,
IF = 286,
IFU = 287,
CONST_FUNC = 288,
WITHOUT_PARAM_FUNC = 289,
UNARY_FUNC = 290,
BINARY_FUNC = 291,
COMA = 292,
RULETOKEN = 293,
COLON = 294,
UINT = 295,
PLUS = 296,
MINUS = 297,
UREAL = 298,
STRING = 299
};
};
@ -278,7 +280,7 @@ namespace DEVS {
static const unsigned char yytable_[];
static const signed char yytable_ninf_;
static const signed char yycheck_[];
static const short int yycheck_[];
/// For a state, its accessing symbol.
static const unsigned char yystos_[];
@ -358,7 +360,7 @@ namespace DEVS {
} // DEVS
/* Line 35 of lalr1.cc */
#line 362 "parser.tab.hh"
#line 364 "parser.tab.hh"

@ -25,7 +25,7 @@
%token LBRACKET "(" RBRACKET ")" LCBRACKET "{" RCBRACKET "}" // ( ) { }
%token AND "and" OR "or" XOR "xor" IMP "imp" EQV "eqv" NOT "not"// and or xor imp eqv not
%token TRUE "t" FALSE "f" UNDEFB "?b" UNDEFC "?c" // t f ?
%token PLUS "+" MINUS "-" MUL "*" DIV "/" // + - * /
%token MUL "*" DIV "/" // + - * /
%token EXCEQV "!=" EQVSIGN "=" GT ">" LT "<" GTEQV ">=" LTEQV "<=" // != = > < >= <=
%token <stringVal> COND_REAL_FUNC // even odd isInt isPrime isUndefined
%token PORTVALUE "portValue" SEND "send" CELLPOS "cellPos" // portValue send cellPos
@ -36,9 +36,11 @@
%token <stringVal> UNARY_FUNC "unary function"
%token <stringVal> BINARY_FUNC "binary function"
%token COMA "," // ,
%token RULETOKEN "rule"
%token COLON ":"
%token <intVal> INT
%token <doubleVal> REAL
%token <intVal> UINT PLUS "+" MINUS "-"
%token <doubleVal> UREAL
%token <stringVal> STRING
%left AND OR XOR IMP EQV
@ -48,7 +50,8 @@
%left MUL DIV
%left LBRACKET RBRACKET
%type <doubleVal> CONSTANT BOOL
%type <intVal> SIGN INT
%type <doubleVal> CONSTANT BOOL REAL
%type <stringVal> RULELIST RULE RESULT BOOLEXP REALRELEXP REALEXP IDREF FUNCTION CELLREF PORTNAME
@ -67,10 +70,9 @@
START : RULELIST { driver->parsed = *$1; delete $1; }
RULELIST : RULE END { $$ = $1; }
| RULE NEWLINE END { $$ = $1; }
| RULE NEWLINE RULELIST { $$=NEWSTR; *$$ = *$1 + "\n" + *$3; delete $1; delete $3; }
| RULE RULELIST { $$=NEWSTR; *$$ = *$1 + "\n" + *$2; delete $1; delete $2; }
RULE : RESULT RESULT LCBRACKET BOOLEXP RCBRACKET { $$=NEWSTR; *$$ = "if("+*$4+"){"+*$1+"##"+*$2+"}"; delete $4; delete $1; delete $2; }
RULE : RULETOKEN COLON RESULT RESULT LCBRACKET BOOLEXP RCBRACKET { $$=NEWSTR; *$$ = "if("+*$6+"){"+*$3+"##"+*$4+"}"; delete $6; delete $3; delete $4; }
RESULT : CONSTANT { $$=NEWSTR; if(isnan($1))*$$ = " NAN "; else *$$ = driver->toString($1); }
| LCBRACKET REALEXP RCBRACKET { $$=NEWSTR; *$$ = "("+*$2+")"; delete $2; }
@ -86,7 +88,7 @@ BOOLEXP : BOOL { $$=NEWSTR; if(isnan($1))*$$ = " NAN "; else *$$ = driver-
| BOOLEXP EQV BOOLEXP { $$=NEWSTR; *$$ = "eqv("+*$1+", "+*$3+") "; delete $1; delete $3; }
REALRELEXP : REALEXP EXCEQV REALEXP { $$=NEWSTR; *$$ = *$1+"!="+*$3; delete $1; delete $3; }
| REALEXP EQVSIGN REALEXP { $$=NEWSTR; *$$ = *$1+"="+*$3; delete $1; delete $3; }
| REALEXP EQVSIGN REALEXP { $$=NEWSTR; *$$ = *$1+"=="+*$3; delete $1; delete $3; }
| REALEXP GT REALEXP { $$=NEWSTR; *$$ = *$1+">"+*$3; delete $1; delete $3; }
| REALEXP LT REALEXP { $$=NEWSTR; *$$ = *$1+"<"+*$3; delete $1; delete $3; }
| REALEXP GTEQV REALEXP { $$=NEWSTR; *$$ = *$1+">="+*$3; delete $1; delete $3; }
@ -96,9 +98,9 @@ REALRELEXP : REALEXP EXCEQV REALEXP { $$=NEWSTR; *$$ = *$1+"!="+*$3; delete $
REALEXP : IDREF { $$=NEWSTR; *$$ = *$1; delete $1; }
| LBRACKET REALEXP RBRACKET { $$=NEWSTR; *$$ = "("+*$2+")"; delete $2; }
| REALEXP PLUS REALEXP { $$=NEWSTR; *$$ = *$1+"+"+*$3; delete $1; delete $3; }
| REALEXP MINUS REALEXP { $$=NEWSTR; *$$ = *$1+"+"+*$3; delete $1; delete $3; }
| REALEXP MUL REALEXP { $$=NEWSTR; *$$ = *$1+"+"+*$3; delete $1; delete $3; }
| REALEXP DIV REALEXP { $$=NEWSTR; *$$ = *$1+"+"+*$3; delete $1; delete $3; }
| REALEXP MINUS REALEXP { $$=NEWSTR; *$$ = *$1+"-"+*$3; delete $1; delete $3; }
| REALEXP MUL REALEXP { $$=NEWSTR; *$$ = *$1+"*"+*$3; delete $1; delete $3; }
| REALEXP DIV REALEXP { $$=NEWSTR; *$$ = *$1+"/"+*$3; delete $1; delete $3; }
IDREF : CELLREF { $$=NEWSTR; *$$ = *$1; delete $1; }
| CONSTANT { $$=NEWSTR; *$$ = driver->toString($1); }
@ -112,6 +114,15 @@ CONSTANT : INT { $$ = $1; }
| CONST_FUNC { $$ = driver->constFunc($1); delete $1; }
| UNDEFC { $$ = NAN; }
INT : UINT { $$ = $1; }
| SIGN UINT { $$ = $1*$2; }
REAL : UREAL { $$ = $1; }
| SIGN UREAL { $$ = $1*$2; }
SIGN : PLUS { $$ = $1; }
| MINUS { $$ = $1; }
FUNCTION : UNARY_FUNC LBRACKET REALEXP RBRACKET { $$=NEWSTR; *$$ = *$1+"("+*$3+")"; delete $1; delete $3; }
| WITHOUT_PARAM_FUNC { $$=NEWSTR; *$$ = *$1+"()"; delete $1; }
| BINARY_FUNC LBRACKET REALEXP COMA REALEXP RBRACKET { $$=NEWSTR; *$$ = *$1+"("+*$3+","+*$5+")"; delete $1; delete $3; delete $5; }

@ -31,23 +31,24 @@ typedef DEVS::Parser::token_type token_type;
yylloc->step();
%}
\%[^\n]*\n { yylloc->lines(); }
\n { yylloc->lines(); return token::NEWLINE; }
\%[^\n]*/\n { }
\n { yylloc->lines(); }
<<EOF>> { return token::END; }
\{ { return token::LCBRACKET; }
\} { return token::RCBRACKET; }
\( { return token::LBRACKET; }
\) { return token::RBRACKET; }
[0-9]+ { yylval->intVal = atoi(YYText()); return token::INT; }
[0-9]+\.[0-9]+ { yylval->doubleVal = atof(YYText()); return token::REAL; }
[0-9]+ { yylval->intVal = atoi(YYText()); return token::UINT; }
[0-9]+\.[0-9]+ { yylval->doubleVal = atof(YYText()); return token::UREAL; }
t { return token::TRUE; }
f { return token::FALSE; }
\?b { return token::UNDEFB; }
\?c { return token::UNDEFC; }
\+ { return token::PLUS; }
\- { return token::MINUS; }
\+ { yylval->intVal = 1; return token::PLUS; }
\- { yylval->intVal =-1; return token::MINUS; }
\* { return token::MUL; }
\/ { return token::DIV; }
\: { return token::COLON; }
"!=" { return token::EXCEQV; }
"=" { return token::EQVSIGN; }
">" { return token::GT; }
@ -55,27 +56,29 @@ f { return token::FALSE; }
">=" { return token::GTEQV; }
"<=" { return token::LTEQV; }
"," { return token::COMA; }
"and" { return token::AND; }
"or" { return token::OR; }
"xor" { return token::XOR; }
"imp" { return token::IMP; }
"eqv" { return token::EQV; }
(even|odd|isInt|isPrime|isUndefined) {
(?i:and) { return token::AND; }
(?i:or) { return token::OR; }
(?i:xor) { return token::XOR; }
(?i:imp) { return token::IMP; }
(?i:eqv) { return token::EQV; }
(?i:not) { return token::NOT; }
(?i:(even|odd|isInt|isPrime|isUndefined)) {
yylval->stringVal = new std::string(YYText()); return token::COND_REAL_FUNC; }
(pi|e|inf|grav|accel|light|planck|avogadro|faraday|rydberg|euler_gamma|bohr_radius|boltzmann|bohr_magneton|golden|catalan|amu|electron_charge|ideal_gas|stefan_boltzmann|proton_mass|electron_mass|neutron_mass|pem) {
(?i:(pi|e|inf|grav|accel|light|planck|avogadro|faraday|rydberg|euler_gamma|bohr_radius|boltzmann|bohr_magneton|golden|catalan|amu|electron_charge|ideal_gas|stefan_boltzmann|proton_mass|electron_mass|neutron_mass|pem)) {
yylval->stringVal = new std::string(YYText()); return token::CONST_FUNC; }
(truecount|falsecount|undefcount|time|random|randomSign) {
(?i:(truecount|falsecount|undefcount|time|random|randomSign)) {
yylval->stringVal = new std::string(YYText()); return token::WITHOUT_PARAM_FUNC; }
(abs|acos|acosh|asin|asinh|atan|atanh|cos|sec|sech|exp|cosh|fact|fractional|ln|log|round|cotan|cosec|cosech|sign|sin|sinh|statecount|sqrt|tan|tanh|trunc|truncUpper|poisson|exponential|randInt|chi|asec|acotan|asech|acosech|nextPrime|radToDeg|degToRad|nth_prime|acotanh|CtoF|CtoK|KtoC|KtoF|FtoC|FtoK) {
(?i:(abs|acos|acosh|asin|asinh|atan|atanh|cos|sec|sech|exp|cosh|fact|fractional|ln|log|round|cotan|cosec|cosech|sign|sin|sinh|statecount|sqrt|tan|tanh|trunc|truncUpper|poisson|exponential|randInt|chi|asec|acotan|asech|acosech|nextPrime|radToDeg|degToRad|nth_prime|acotanh|CtoF|CtoK|KtoC|KtoF|FtoC|FtoK)) {
yylval->stringVal = new std::string(YYText()); return token::UNARY_FUNC; }
(comb|logn|max|min|power|remainder|root|beta|gamma|lcm|gcd|normal|f|uniform|binomial|rectToPolar_r|rectToPolar_angle|polarToRect_x|hip|polarToRect_y) {
(?i:(comb|logn|max|min|power|remainder|root|beta|gamma|lcm|gcd|normal|f|uniform|binomial|rectToPolar_r|rectToPolar_angle|polarToRect_x|hip|polarToRect_y)) {
yylval->stringVal = new std::string(YYText()); return token::BINARY_FUNC; }
"portValue" { return token::PORTVALUE; }
"send" { return token::SEND; }
"cellPos" { return token::CELLPOS; }
"thisPort" { return token::THISPORT; }
"ifu" { return token::IFU; }
"if" { return token::IF; }
(?i:portValue) { return token::PORTVALUE; }
(?i:send) { return token::SEND; }
(?i:cellPos) { return token::CELLPOS; }
(?i:thisPort) { return token::THISPORT; }
(?i:ifu) { return token::IFU; }
(?i:if) { return token::IF; }
(?i:rule) { return token::RULETOKEN; }
[A-Za-z]+ { yylval->stringVal = new std::string(YYText()); return token::STRING; }
. { }