@@ -520,6 +520,73 @@ public class CParser {
520520 }
521521 }
522522
523+ Object computeBinaryValue(Object obj1, Token operation, Object obj2) {
524+ if (!(obj1 instanceof Long && obj2 instanceof Long)) {
525+ return null;
526+ }
527+ Long val1 = (Long) obj1;
528+ Long val2 = (Long) obj2;
529+
530+ switch(operation.image) {
531+ case "<<":
532+ return val1 << val2;
533+ case ">>":
534+ return val1 >> val2;
535+ case "+":
536+ return val1 + val2;
537+ case "-":
538+ return val1 - val2;
539+ case "*":
540+ return val1 * val2;
541+ case "/":
542+ return val1 / val2;
543+ case "%":
544+ return val1 % val2;
545+ case "|":
546+ return val1 | val2;
547+ case "&":
548+ return val1 & val2;
549+ case "^":
550+ return val1 ^ val2;
551+ case "==":
552+ return (val1 == val2 ? 1 : 0);
553+ case "!=":
554+ return (val1 != val2 ? 1 : 0);
555+ case "<":
556+ return (val1 < val2 ? 1 : 0);
557+ case ">":
558+ return (val1 > val2 ? 1 : 0);
559+ case "<=":
560+ return (val1 <= val2 ? 1 : 0);
561+ case ">=":
562+ return (val1 >= val2 ? 1 : 0);
563+ case "&&":
564+ return ((val1 != 0 && val2 != 0) ? 1 : 0);
565+ case "||":
566+ return ((val1 != 0 || val2 != 0) ? 1 : 0);
567+ }
568+ return null;
569+ }
570+
571+ Object computeUnaryValue(Object obj, Token operation) {
572+ if (!(obj instanceof Long)) {
573+ return null;
574+ }
575+ Long val = (Long) obj;
576+
577+ switch(operation.image) {
578+ case "+":
579+ return val;
580+ case "-":
581+ return -val;
582+ case "~":
583+ return ~val;
584+ case "!":
585+ return (val != 0 ? 0 : 1);
586+ }
587+ return null;
588+ }
589+
523590 /**
524591 * Get the data type manager
525592 *
@@ -1517,7 +1584,7 @@ void DeclSpecifier() : {
15171584{
15181585 "(" DeclSpecifier() ")" |
15191586 <IDENTIFIER> [ "("
1520- DeclConstant()
1587+ DeclConstant() ( DeclConstant() )*
15211588 ")" ]
15221589}
15231590
@@ -1743,6 +1810,7 @@ void StructDeclaration(Composite comp, CompositeHandler compositeHandler) : {
17431810 Declaration dt = null;
17441811}
17451812{
1813+ LineDef() |
17461814 (
17471815 [ dt = SpecifierQualifierList() ]
17481816 [
@@ -2165,16 +2233,28 @@ void IdentifierList(FunctionDefinitionDataType funcDT, DataType retDT) : {
21652233
21662234void Initializer() : {}
21672235{
2168- ( AssignmentExpression() | "{" InitializerList() [ "," ] "}" )
2236+ ( AssignmentExpression() | "{" InitializerList() [ "," ] "}" )
21692237}
21702238
21712239void InitializerList() : {}
21722240{
2173- Initializer()
2174- (
2175- LOOKAHEAD(2)
2176- "," Initializer()
2177- )*
2241+ [ Designation() ] Initializer() [ "," InitializerList() ]
2242+ }
2243+
2244+ void Designation() : { }
2245+ {
2246+ DesignatorList() "="
2247+ }
2248+
2249+ void DesignatorList() : { }
2250+ {
2251+ Designator() [ DesignatorList() ]
2252+ }
2253+
2254+ void Designator() : { }
2255+ {
2256+ "[" ConstantExpression() "]" |
2257+ "." <IDENTIFIER>
21782258}
21792259
21802260DataType TypeName() : {
@@ -2415,120 +2495,117 @@ Object ConstantExpression() : {
24152495}
24162496
24172497Object LogicalORExpression() : {
2418- Object obj = null;
2498+ Object obj = null, obj2 = null; Token op=null ;
24192499}
24202500{
2421- obj = LogicalANDExpression() [ "||" LogicalORExpression () { obj=null ; } ]
2501+ obj = LogicalANDExpression() ( op= "||" obj2 = LogicalANDExpression () { obj = computeBinaryValue(obj, op, obj2) ; } ) *
24222502 {
24232503 return obj;
24242504 }
24252505}
24262506
24272507Object LogicalANDExpression() : {
2428- Object obj = null;
2508+ Object obj = null, obj2 = null; Token op=null ;
24292509}
24302510{
2431- obj = InclusiveORExpression() [ "&&" LogicalANDExpression () { obj=null ; } ]
2511+ obj = InclusiveORExpression() ( op= "&&" obj2=InclusiveORExpression () { obj = computeBinaryValue(obj, op, obj2) ; } ) *
24322512 {
24332513 return obj;
24342514 }
24352515}
24362516
24372517Object InclusiveORExpression() : {
2438- Object obj = null;
2518+ Object obj = null, obj2 = null; Token op=null ;
24392519}
24402520{
2441- obj = ExclusiveORExpression() [ "|" InclusiveORExpression () { obj=null ; } ]
2521+ obj = ExclusiveORExpression() ( op= "|" obj2=ExclusiveORExpression () { obj = computeBinaryValue(obj, op, obj2) ; } ) *
24422522 {
24432523 return obj;
24442524 }
24452525}
24462526
24472527Object ExclusiveORExpression() : {
2448- Object obj = null;
2528+ Object obj = null, obj2 = null; Token op=null ;
24492529}
24502530{
2451- obj = ANDExpression() [ "^" ExclusiveORExpression () { obj=null ; } ]
2531+ obj = ANDExpression() ( op= "^" obj2=ANDExpression () { obj = computeBinaryValue(obj, op, obj2) ; } ) *
24522532 {
24532533 return obj;
24542534 }
24552535}
24562536
24572537Object ANDExpression() : {
2458- Object obj = null;
2538+ Object obj = null, obj2 = null; Token op=null ;
24592539}
24602540{
2461- obj = EqualityExpression() [ "&" ANDExpression () { obj=null ; } ]
2541+ obj = EqualityExpression() ( op= "&" obj2=EqualityExpression () { obj = computeBinaryValue(obj, op, obj2) ; } ) *
24622542 {
24632543 return obj;
24642544 }
24652545}
24662546
24672547Object EqualityExpression() : {
2468- Object obj = null;
2548+ Object obj = null, obj2 = null; Token op=null ;
24692549}
24702550{
2471- obj = RelationalExpression() [ ( "==" | "!=" ) EqualityExpression() { obj=null; } ]
2551+ obj = RelationalExpression()
2552+ (
2553+ (op="==" | op="!=") obj2 = RelationalExpression() { obj = computeBinaryValue(obj, op, obj2); } ) *
24722554 {
24732555 return obj;
24742556 }
24752557}
24762558
24772559Object RelationalExpression() : {
2478- Object obj = null;
2560+ Object obj = null, obj2 = null; Token op=null ;
24792561}
24802562{
2481- obj = ShiftExpression() [ ( "<" | ">" | "<=" | ">=" ) RelationalExpression() { obj=null; } ]
2563+ obj = ShiftExpression()
2564+ (
2565+ (op="<" | op=">" | op="<=" | op=">=") obj2=ShiftExpression() { obj = computeBinaryValue(obj, op, obj2); }
2566+ ) *
24822567 {
24832568 return obj;
24842569 }
24852570}
24862571
24872572Object ShiftExpression() : {
2488- Object obj1 = null, obj2 = null;
2573+ Object obj = null, obj2 = null; Token op= null;
24892574}
24902575{
2491- obj1 = AdditiveExpression()
2492- [
2493- "<<" obj2 = AdditiveExpression()
2494- { if (obj1 instanceof Long && obj2 instanceof Long) { return ((Long) obj1) << ((Long) obj2); } }
2495- | ">>" obj2 = AdditiveExpression()
2496- { if (obj1 instanceof Long && obj2 instanceof Long) { return ((Long) obj1) >> ((Long) obj2); } }
2497- ]
2576+ obj = AdditiveExpression()
2577+ (
2578+ ( op="<<" | op=">>" ) obj2 = AdditiveExpression()
2579+ { obj = computeBinaryValue(obj, op, obj2); }
2580+ ) *
24982581 {
2499- return obj1 ;
2582+ return obj ;
25002583 }
25012584}
25022585
25032586Object AdditiveExpression() : {
2504- Object obj1 = null, obj2 = null;
2587+ Object obj = null, obj2 = null; Token op= null;
25052588}
25062589{
2507- obj1 = MultiplicativeExpression() [
2508- "+" obj2 = AdditiveExpression()
2509- { if (obj1 instanceof Long && obj2 instanceof Long) { return ((Long) obj1) + ((Long) obj2); } }
2510- | "-" obj2 = AdditiveExpression()
2511- { if (obj1 instanceof Long && obj2 instanceof Long) { return ((Long) obj1) - ((Long) obj2); } }
2512- ]
2590+ obj = MultiplicativeExpression()
2591+ ( ( op="+" | op="-" ) obj2 = MultiplicativeExpression()
2592+ { obj = computeBinaryValue(obj, op, obj2); }
2593+ ) *
25132594 {
2514- return obj1 ;
2595+ return obj ;
25152596 }
25162597}
25172598
25182599Object MultiplicativeExpression() : {
2519- Object obj1 = null, obj2 = null;
2600+ Object obj = null, obj2 = null; Token op= null;
25202601}
25212602{
2522- obj1 = CastExpression() [
2523- "*" obj2 = ConstantExpression()
2524- { if (obj1 instanceof Long && obj2 instanceof Long) { return ((Long) obj1) * ((Long) obj2); } }
2525- | "/" obj2 = ConstantExpression()
2526- { if (obj1 instanceof Long && obj2 instanceof Long) { return ((Long) obj1) / ((Long) obj2); } }
2527- | "%" obj2 = ConstantExpression()
2528- { if (obj1 instanceof Long && obj2 instanceof Long) { return ((Long) obj1) % ((Long) obj2); } }
2529- ]
2603+ obj = CastExpression()
2604+ ( ( op="*" | op="/" | op="%" ) obj2 = CastExpression()
2605+ { obj = computeBinaryValue(obj, op, obj2); }
2606+ ) *
25302607 {
2531- return obj1 ;
2608+ return obj ;
25322609 }
25332610}
25342611
@@ -2537,8 +2614,11 @@ Object CastExpression() : {
25372614}
25382615{
25392616 (
2540- LOOKAHEAD("(" TypeName() ")" CastExpression() )
2541- "(" TypeName() ")" CastExpression()
2617+ LOOKAHEAD("(" TypeName() ")")
2618+ (
2619+ "(" TypeName() ")" ( CastExpression() |
2620+ ( "{" InitializerList() [ "," ] "}" ) )
2621+ )
25422622 |
25432623 obj = UnaryExpression()
25442624 )
@@ -2550,18 +2630,27 @@ Object CastExpression() : {
25502630Object UnaryExpression() : {
25512631 DataType dt = null;
25522632 Object obj = null;
2633+ Token op = null;
25532634}
25542635{
25552636 (
25562637 LOOKAHEAD(3)
2557- obj = PostfixExpression()
2638+ obj = PostfixExpression()
2639+ |
2640+ UnaryOperator() CastExpression()
25582641 |
25592642 "++" UnaryExpression()
25602643 |
25612644 "--" UnaryExpression()
2645+ |
2646+ "+" obj=CastExpression()
2647+ |
2648+ op="-" obj=CastExpression() { obj = computeUnaryValue(obj, op); }
25622649 |
2563- UnaryOperator () CastExpression()
2650+ op="~" obj=CastExpression () { obj = computeUnaryValue(obj, op); }
25642651 |
2652+ op="!" obj=CastExpression() { obj = computeUnaryValue(obj, op); }
2653+ |
25652654 <SIZEOF>
25662655 (
25672656 LOOKAHEAD(UnaryExpression() )
@@ -2580,9 +2669,13 @@ Object UnaryExpression() : {
25802669 }
25812670}
25822671
2583- void UnaryOperator() : {}
2672+ void UnaryOperator() : { }
25842673{
2585- ( "&" | "*" | "+" | "-" | "~" | "!" )
2674+ (
2675+ "&"
2676+ |
2677+ "*"
2678+ )
25862679}
25872680
25882681Object PostfixExpression() : {
@@ -2591,22 +2684,22 @@ Object PostfixExpression() : {
25912684{
25922685 obj = PrimaryExpression()
25932686 (
2594- "[" Expression() "]"
2687+ ( "[" Expression() "]" )
25952688 |
25962689 "("
25972690 [
25982691 LOOKAHEAD(ArgumentExpressionList() )
25992692 ArgumentExpressionList()
26002693 ]
2601- ")"
2694+ ")"
26022695 |
26032696 "." <IDENTIFIER>
26042697 |
26052698 "->" <IDENTIFIER>
26062699 |
26072700 "++"
26082701 |
2609- "--"
2702+ "--"
26102703 )*
26112704 {
26122705 return obj;
0 commit comments