Warning, /graphics/kst-plot/src/libkstmath/eparse.y is written in an unsupported language. File is not indexed.
0001
0002 %{
0003 #include <assert.h>
0004 #include <stdlib.h>
0005 #include <stdio.h>
0006
0007 #include <objectstore.h>
0008
0009 #include "enodefactory.h"
0010
0011 #include "eparse-eh.h"
0012 extern int yylex(Kst::ObjectStore *store);
0013 void *ParsedEquation = 0L;
0014
0015 %}
0016
0017 %parse-param { Kst::ObjectStore *store }
0018 %lex-param { Kst::ObjectStore *store }
0019
0020 %union {
0021 char *data;
0022 double number;
0023 void *n; /* tree node */
0024 char character;
0025 }
0026
0027
0028 %token T_NUMBER T_IDENTIFIER T_DATA T_OPENPAR T_CLOSEPAR T_COMMA T_INVALID
0029
0030 %left <operator> T_LOR
0031 %left <operator> T_LAND
0032 %left <operator> T_OR
0033 %left <operator> T_AND
0034 %left <operator> T_EQ T_NE
0035 %left <operator> T_LT T_LE T_GT T_GE
0036 %left <operator> T_ADD T_SUBTRACT
0037 %left <operator> T_MULTIPLY T_DIVIDE T_MOD
0038 %left <operator> T_NOT
0039 %nonassoc U_SUBTRACT
0040 %right <operator> T_EXP
0041
0042 %start WRAPPER
0043
0044 %%
0045
0046 WRAPPER : { $<n>$ = 0L; yyClearErrors(); ParsedEquation = 0L; } PRESTART
0047 { $<n>$ = ParsedEquation = $<n>2;
0048 if (yyErrorCount() > 0) {
0049 DeleteNode($<n>$);
0050 $<n>$ = 0L;
0051 ParsedEquation = 0L;
0052 YYERROR;
0053 }
0054 }
0055 ;
0056
0057 PRESTART : START
0058 { $<n>$ = $<n>1; }
0059 | /**/
0060 { $<n>$ = 0L; yyerror(store, EParseErrorEmpty); }
0061 ;
0062
0063 START : BOOLEAN_OR
0064 { $<n>$ = $<n>1; }
0065 ;
0066
0067 BOOLEAN_OR : BOOLEAN_OR T_LOR BOOLEAN_AND
0068 { $<n>$ = NewLogicalOr($<n>1, $<n>3); }
0069 | T_LOR error
0070 { yyerror(store, EParseErrorTwoOperands); $<n>$ = 0L; }
0071 | BOOLEAN_AND
0072 { $<n>$ = $<n>1; }
0073 ;
0074
0075 BOOLEAN_AND : BOOLEAN_AND T_LAND COMPARISON
0076 { $<n>$ = NewLogicalAnd($<n>1, $<n>3); }
0077 | T_LAND error
0078 { yyerror(store, EParseErrorTwoOperands); $<n>$ = 0L; }
0079 | COMPARISON
0080 { $<n>$ = $<n>1; }
0081 ;
0082
0083 COMPARISON : COMPARISON T_LT EQUATION
0084 { $<n>$ = NewLessThan($<n>1, $<n>3); }
0085 | COMPARISON T_LE EQUATION
0086 { $<n>$ = NewLessThanEqual($<n>1, $<n>3); }
0087 | COMPARISON T_GT EQUATION
0088 { $<n>$ = NewGreaterThan($<n>1, $<n>3); }
0089 | COMPARISON T_GE EQUATION
0090 { $<n>$ = NewGreaterThanEqual($<n>1, $<n>3); }
0091 | COMPARISON T_EQ EQUATION
0092 { $<n>$ = NewEqualTo($<n>1, $<n>3); }
0093 | COMPARISON T_NE EQUATION
0094 { $<n>$ = NewNotEqualTo($<n>1, $<n>3); }
0095 | T_LT error
0096 { yyerror(store, EParseErrorTwoOperands); $<n>$ = 0L; }
0097 | T_GT error
0098 { yyerror(store, EParseErrorTwoOperands); $<n>$ = 0L; }
0099 | T_LE error
0100 { yyerror(store, EParseErrorTwoOperands); $<n>$ = 0L; }
0101 | T_GE error
0102 { yyerror(store, EParseErrorTwoOperands); $<n>$ = 0L; }
0103 | T_EQ error
0104 { yyerror(store, EParseErrorTwoOperands); $<n>$ = 0L; }
0105 | T_NE error
0106 { yyerror(store, EParseErrorTwoOperands); $<n>$ = 0L; }
0107 | EQUATION
0108 { $<n>$ = $<n>1; }
0109 ;
0110
0111 EQUATION : EQUATION T_ADD TERM
0112 { $<n>$ = NewAddition($<n>1, $<n>3); }
0113 | EQUATION T_SUBTRACT TERM
0114 { $<n>$ = NewSubtraction($<n>1, $<n>3); }
0115 | EQUATION T_OR TERM
0116 { $<n>$ = NewBitwiseOr($<n>1, $<n>3); }
0117 | EQUATION T_AND TERM
0118 { $<n>$ = NewBitwiseAnd($<n>1, $<n>3); }
0119 | TERM
0120 { $<n>$ = $<n>1; }
0121 | T_OR error
0122 { yyerror(store, EParseErrorTwoOperands); $<n>$ = 0L; }
0123 | T_AND error
0124 { yyerror(store, EParseErrorTwoOperands); $<n>$ = 0L; }
0125 ;
0126
0127 TERM : TERM T_MULTIPLY NEG
0128 { $<n>$ = NewMultiplication($<n>1, $<n>3); }
0129 | TERM T_DIVIDE NEG
0130 { $<n>$ = NewDivision($<n>1, $<n>3); }
0131 | TERM T_MOD NEG
0132 { $<n>$ = NewModulo($<n>1, $<n>3); }
0133 | T_MULTIPLY error
0134 { yyerror(store, EParseErrorTwoOperands); $<n>$ = 0L; }
0135 | T_DIVIDE error
0136 { yyerror(store, EParseErrorTwoOperands); $<n>$ = 0L; }
0137 | T_MOD error
0138 { yyerror(store, EParseErrorTwoOperands); $<n>$ = 0L; }
0139 | NEG
0140 { $<n>$ = $<n>1; }
0141 ;
0142
0143 NEG : T_SUBTRACT NEG %prec U_SUBTRACT
0144 { $<n>$ = NewNegation($<n>2); }
0145 | T_NOT NEG
0146 { $<n>$ = NewNot($<n>2); }
0147 | T_NOT error
0148 { $<n>$ = 0L; yyerror(store, EParseErrorRequiresOperand); }
0149 | EXP
0150 { $<n>$ = $<n>1; }
0151 ;
0152
0153 EXP : EXP T_EXP EXP
0154 { $<n>$ = NewPower($<n>1, $<n>3); }
0155 | EXP T_EXP error
0156 { DeleteNode($<n>1); $<n>$ = 0L; yyerror(store, EParseErrorTwoOperands); }
0157 | EXP T_EXP /**/
0158 { DeleteNode($<n>1); $<n>$ = 0L; yyerror(store, EParseErrorTwoOperands); }
0159 | T_EXP error
0160 { $<n>$ = 0L; yyerror(store, EParseErrorTwoOperands); }
0161 | ATOMIC
0162 { $<n>$ = $<n>1; }
0163 ;
0164
0165 ATOMIC : T_OPENPAR BOOLEAN_OR T_CLOSEPAR
0166 { $<n>$ = $<n>2; ParenthesizeNode($<n>$); }
0167 | T_OPENPAR error
0168 { yyerror(store, EParseErrorMissingClosingParenthesis); $<n>$ = 0L; }
0169 | T_IDENTIFIER
0170 { $<n>$ = NewIdentifier($<data>1); }
0171 | T_DATA
0172 { $<n>$ = NewData(store, $<data>1); }
0173 | T_IDENTIFIER T_OPENPAR T_CLOSEPAR error
0174 { yyerror(store, EParseErrorNoImplicitMultiply); free($<data>1); $<n>$ = 0L; }
0175 | T_IDENTIFIER T_OPENPAR T_CLOSEPAR
0176 { $<n>$ = NewFunction($<data>1, NewArgumentList()); }
0177 /* | T_IDENTIFIER T_OPENPAR ARGUMENTS error
0178 { yyerror(store, EParseErrorMissingClosingParenthesis); DeleteNode($<n>3); free($<data>1); $<n>$ = 0L; }
0179 */
0180 | T_IDENTIFIER T_OPENPAR ARGUMENTS T_CLOSEPAR error
0181 { yyerror(store, EParseErrorNoImplicitMultiply); DeleteNode($<n>3); free($<data>1); $<n>$ = 0L; }
0182 | T_IDENTIFIER T_OPENPAR ARGUMENTS T_CLOSEPAR
0183 { $<n>$ = NewFunction($<data>1, $<n>3); }
0184 | T_IDENTIFIER T_OPENPAR error
0185 { yyerror(store, EParseErrorMissingClosingParenthesis); free($<data>1); $<n>$ = 0L; }
0186 | T_NUMBER
0187 { $<n>$ = NewNumber($<number>1); }
0188 | T_NUMBER error
0189 { yyerror(store, EParseErrorNoImplicitMultiply); $<n>$ = 0L; }
0190 | T_INVALID
0191 { yyerrortoken($<character>1); $<n>$ = 0L; }
0192 | T_OPENPAR T_CLOSEPAR
0193 { yyerror(store, EParseErrorEmptyParentheses); $<n>$ = 0L; }
0194 ;
0195
0196 ARGUMENTS : ARGLIST
0197 { $<n>$ = $<n>1; }
0198 ;
0199
0200 ARGLIST : ARGLIST T_COMMA ARGUMENT
0201 { if ($<n>1 && $<n>3) { AppendArgument($<n>1, $<n>3); } else { DeleteNode($<n>1); DeleteNode($<n>3); $<n>1 = 0L; } $<n>$ = $<n>1; }
0202 | ARGUMENT
0203 { if ($<n>1) { $<n>$ = NewArgumentList(); AppendArgument($<n>$, $<n>1); } else { $<n>$ = 0L; } }
0204 | ARGLIST T_COMMA error
0205 { $<n>$ = 0L; DeleteNode($<n>1); yyerror(store, EParseErrorEmptyArg); }
0206 | {} /**/ T_COMMA ARGUMENT
0207 { yyerror(store, EParseErrorEmptyArg); DeleteNode($<n>3); $<n>$ = 0L; }
0208 ;
0209
0210 ARGUMENT : START
0211 { $<n>$ = $<n>1; }
0212 ;
0213
0214 %%
0215