前两天觉得LEX和YACC挺强大的,稍微写了一个处理表达式的程序
LEX文件:
YACC文件:
编译并运行:
lex expr.l && yacc -d expr.y && gcc lex.yy.c y.tab.c -o expr -ll && echo "OK" && ./expr
附表达式的优先级表:
http://www.cppreference.com/wiki/operator_precedence
| Precedence | Operator | Description | Example | Overloadable | Associativity | |
|---|---|---|---|---|---|---|
| 1 | :: | Scope resolution operator | Class::age = 2; | no | none | |
| 2 | ()()[]->.++--const_castdynamic_caststatic_castreinterpret_casttypeid | Function call Member initalization Array access Member access from a pointer Member access from an object Post-increment Post-decrement Special cast Special cast Special cast Special cast Runtime type information | isdigit('1') c_tor(int x, int y) : _x(x), _y(y*10){}; array[4] = 2; ptr->age = 34; obj.age = 34; for( int i = 0; i < 10; i++ ) cout << i; for( int i = 10; i > 0; i-- ) cout << i; const_cast<type_to>(type_from); dynamic_cast<type_to>(type_from); static_cast<type_to>(type_from); reinterpret_cast<type_to>(type_from); cout « typeid(type).name(); | yes yes yes yes no yes yes no no no no no | left to right | |
| 3 | !not~compl++---+*&newnew []deletedelete [](type)sizeof | Logical negation Alternate spelling for ! Bitwise complement Alternate spelling for ~ Pre-increment Pre-decrement Unary minus Unary plus Dereference Address of Dynamic memory allocation Dynamic memory allocation of array Deallocating the memory Deallocating the memory of array Cast to a given type Return size of an object or type | if( !done ) … flags = ~flags; for( i = 0; i < 10; ++i ) cout << i; for( i = 10; i > 0; --i ) cout << i; int i = -1; int i = +1; int data = *intPtr; int *intPtr = &data; long *pVar = new long; MyClass *ptr = new MyClass(args); delete pVar; delete [] array; int i = (int) floatNum;//int size = sizeof(float); | yes yes yes yes yes yes yes yes yes yes yes yes yes no | right to left | |
| 4 | ->*.* | Member pointer selector Member object selector | ptr->*var = 24; obj.*var = 24; | yes no | left to right | |
| 5 | */% | Multiplication Division Modulus | int i = 2 * 4; float f = 10.0 / 3.0; int rem = 4 % 3; | yes yes yes | left to right | |
| 6 | +- | Addition Subtraction | int i = 2 + 3; int i = 5 - 1; | yes yes | left to right | |
| 7 | <<>> | Bitwise shift left Bitwise shift right | int flags = 33 << 1; int flags = 33 >> 1; | yes yes | left to right | |
| 8 | <<=>>= | Comparison less-than Comparison less-than-or-equal-to Comparison greater-than Comparison greater-than-or-equal-to | if( i < 42 ) … if( i <= 42 ) ... if( i > 42 ) … if( i >= 42 ) ... | yes yes yes yes | left to right | |
| 9 | ==eq!=not_eq | Comparison equal-to Alternate spelling for == Comparison not-equal-to Alternate spelling for != | if( i == 42 ) ... if( i != 42 ) … | yes - yes | left to right | |
| 10 | &bitand | Bitwise AND Alternate spelling for & | flags = flags & 42; | yes | left to right | |
| 11 | ^xor | Bitwise exclusive OR (XOR) Alternate spelling for ^ | flags = flags ^ 42; | yes | left to right | |
| 12 | |bitor | Bitwise inclusive (normal) OR Alternate spelling for | | flags = flags | 42; | yes | left to right | |
| 13 | &&and | Logical AND Alternate spelling for && | if( conditionA && conditionB ) … | yes | left to right | |
| 14 | ||or | Logical OR Alternate spelling for || | if( conditionA || conditionB ) ... | yes | left to right | |
| 15 | ? : | Ternary conditional (if-then-else) | int i = (a > b) ? a : b; | no | right to left | |
| 16 | =+=-=*=/=%=&=and_eq^=xor_eq|=or_eq<<=>>= | Assignment operator Increment and assign Decrement and assign Multiply and assign Divide and assign Modulo and assign Bitwise AND and assign Alternate spelling for &= Bitwise exclusive or (XOR) and assign Alternate spelling for ^= Bitwise normal OR and assign Alternate spelling for |= Bitwise shift left and assign Bitwise shift right and assign | int a = b; a += 3; b -= 4; a *= 5; a /= 2; a %= 3; flags &= new_flags; flags ^= new_flags; flags |= new_flags; flags <<= 2; flags >>= 2; | yes yes yes yes yes yes yes yes yes yes yes | right to left | |
| 17 | throw | throw exception | throw EClass(“Message”); | no | ||
| 18 | , | Sequential evaluation operator | for( i = 0, j = 0; i < 10; i++, j++ ) … | yes | left to right | |
本文介绍使用LEX和YACC工具实现了一个简单的表达式解析程序。该程序能够处理包括算术运算、逻辑运算及比较运算在内的多种类型的操作,并通过细致的规则定义实现了正确的运算符优先级。
817

被折叠的 条评论
为什么被折叠?



