From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9037 invoked by alias); 18 Mar 2008 21:50:30 -0000 Received: (qmail 8977 invoked by uid 9708); 18 Mar 2008 21:50:30 -0000 Date: Tue, 18 Mar 2008 21:50:00 -0000 Message-ID: <20080318215030.8962.qmail@sourceware.org> From: tthomas@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Implement decrement, increment; arithmetic minus, plus operations. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 60b3e338ecd23f9bf5a2f67a7d7c177f90c640ba X-Git-Newrev: 7821ab11bdda699d0fc127060371de639968e157 Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q1/txt/msg00403.txt.bz2 The branch, master has been updated via 7821ab11bdda699d0fc127060371de639968e157 (commit) from 60b3e338ecd23f9bf5a2f67a7d7c177f90c640ba (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 7821ab11bdda699d0fc127060371de639968e157 Author: Teresa Thomas Date: Tue Mar 18 17:33:19 2008 -0400 Implement decrement, increment; arithmetic minus, plus operations. frysk-core/frysk/expr/ChangeLog: 2008-03-18 Teresa Thomas * CExpr.g (ARITHMETIC_PLUS): New (ARITHMETIC_MINUS): New (PREINCREMENT, PREDECREMENT): New (POSTINCREMENT, POSTDECREMENT): New * CExprEvaluator.g: Implement above ops. * TestArithmetics.java (testAdd): Add tests. * TestbedSymTab.java (kappa): New. ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/expr/CExpr.g | 34 ++++++++++++++++------- frysk-core/frysk/expr/CExprEvaluator.g | 41 ++++++++++++++++++++++++++++ frysk-core/frysk/expr/ChangeLog | 10 +++++++ frysk-core/frysk/expr/TestArithmetics.java | 12 +++++++- frysk-core/frysk/expr/TestbedSymTab.java | 4 ++- 5 files changed, 89 insertions(+), 12 deletions(-) First 500 lines of diff: diff --git a/frysk-core/frysk/expr/CExpr.g b/frysk-core/frysk/expr/CExpr.g index 6681f0a..dd58ef3 100644 --- a/frysk-core/frysk/expr/CExpr.g +++ b/frysk-core/frysk/expr/CExpr.g @@ -116,6 +116,12 @@ imaginaryTokenDefinitions SIZEOF INDEX SLICE + ARITHMETIC_PLUS + ARITHMETIC_MINUS + PREINCREMENT + PREDECREMENT + POSTINCREMENT + POSTDECREMENT ; /** @@ -130,7 +136,7 @@ start * This rule looks for comma separated expressions. */ expressionList - : (PLUS!)? expression (COMMA! expression)* + : expression (COMMA! expression)* {#expressionList = #(#[EXPR_LIST,"Expr list"], expressionList);} ; @@ -280,12 +286,20 @@ prefix_expression { ## = #(#[SIZEOF, "Size_Of"], #expr); } //sizeof (type) - | PLUSPLUS^ prefix_expression - | MINUSMINUS^ prefix_expression + | PLUSPLUS^ pp_expr: prefix_expression + { ## = #([PREINCREMENT, "Preincrement"], #pp_expr); + } + | MINUSMINUS^ mm_expr: prefix_expression + { ## = #([PREDECREMENT, "Preincrement"], #mm_expr); + } | TILDE^ prefix_expression | NOT^ prefix_expression - | MINUS^ prefix_expression - | PLUS^ prefix_expression + | MINUS^ n_expr: prefix_expression + { ## = #([ARITHMETIC_MINUS, "Arithmetic_minus"], #n_expr); + } + | PLUS^ p_expr: prefix_expression + { ## = #([ARITHMETIC_PLUS, "Arithmetic_plus"], #p_expr); + } | AMPERSAND addr_expr: prefix_expression { ## = #([ADDRESS_OF, "Address_Of"], #addr_expr); } @@ -328,12 +342,12 @@ postfix_expression! ) | LPAREN! expressionList RPAREN! | PLUSPLUS - { astPostExpr = #(PLUSPLUS, #astPostExpr); - } + { astPostExpr = #(#[POSTINCREMENT, "Postincrement"], #astPostExpr); + } | MINUSMINUS - { astPostExpr = #(MINUSMINUS, #astPostExpr); - } - )* + { astPostExpr = #(#[POSTDECREMENT, "Postdecrement"], #astPostExpr); + } + )* ) { ## = #astPostExpr; } ; diff --git a/frysk-core/frysk/expr/CExprEvaluator.g b/frysk-core/frysk/expr/CExprEvaluator.g index 7285f90..24f6f08 100644 --- a/frysk-core/frysk/expr/CExprEvaluator.g +++ b/frysk-core/frysk/expr/CExprEvaluator.g @@ -279,6 +279,47 @@ expr returns [Value returnVar=null] returnVar = v1.getType().getALU(exprSymTab.getWordSize()) .bitWiseComplement(v1); } + | #(ARITHMETIC_PLUS v1=expr) { + returnVar = v1; + } + | #(ARITHMETIC_MINUS v1=expr) { + Value zero = longType.createValue(0); + returnVar = v1.getType().getALU(zero.getType(), + exprSymTab.getWordSize()) + .subtract(zero, v1); + } + | #(PREINCREMENT v1=expr) { + Value one = longType.createValue(1); + v1.assign(v1.getType().getALU(one.getType(), + exprSymTab.getWordSize()) + .add(one, v1)); + returnVar = v1; + } + | #(PREDECREMENT v1=expr) { + Value one = longType.createValue(1); + v1.assign(v1.getType().getALU(one.getType(), + exprSymTab.getWordSize()) + .subtract(v1, one)); + returnVar = v1; + } + | #(POSTINCREMENT v1=expr) { + Value one = longType.createValue(1); + v1.assign(v1.getType().getALU(one.getType(), + exprSymTab.getWordSize()) + .add(one, v1)); + returnVar = (v1.getType().getALU(one.getType(), + exprSymTab.getWordSize()) + .subtract(v1, one)); + } + | #(POSTDECREMENT v1=expr) { + Value one = longType.createValue(1); + v1.assign(v1.getType().getALU(one.getType(), + exprSymTab.getWordSize()) + .subtract(v1, one)); + returnVar = (v1.getType().getALU(one.getType(), + exprSymTab.getWordSize()) + .add(v1, one)); + } | #(COND_EXPR log_expr=expr v1=expr v2=expr) { returnVar = ((log_expr.getType().getALU(log_expr.getType(), exprSymTab.getWordSize()) diff --git a/frysk-core/frysk/expr/ChangeLog b/frysk-core/frysk/expr/ChangeLog index bd4811d..20320ce 100644 --- a/frysk-core/frysk/expr/ChangeLog +++ b/frysk-core/frysk/expr/ChangeLog @@ -1,3 +1,13 @@ +2008-03-18 Teresa Thomas + + * CExpr.g (ARITHMETIC_PLUS): New + (ARITHMETIC_MINUS): New + (PREINCREMENT, PREDECREMENT): New + (POSTINCREMENT, POSTDECREMENT): New + * CExprEvaluator.g: Implement above ops. + * TestArithmetics.java (testAdd): Add tests. + * TestbedSymTab.java (kappa): New. + 2008-03-11 Teresa Thomas * CExpr.g: Allow +expression. diff --git a/frysk-core/frysk/expr/TestArithmetics.java b/frysk-core/frysk/expr/TestArithmetics.java index 7968a76..ad8ed4e 100644 --- a/frysk-core/frysk/expr/TestArithmetics.java +++ b/frysk-core/frysk/expr/TestArithmetics.java @@ -54,6 +54,8 @@ public class TestArithmetics extends TestCase { } public void testAdd() { checkScratchExpr("1 + 2", 3); + checkScratchExpr("+1 + +3*2", 7); + checkScratchExpr("+1 + (-3)*2", -5); } private void checkVariableExpr(String expr, long value) { @@ -64,7 +66,15 @@ public class TestArithmetics extends TestCase { public void testMember() { checkVariableExpr("a.alpha", 0x01020304); } - + + public void testIncrement() { + checkVariableExpr("a.kappa++ + ++a.kappa", 4); + } + + public void testDecrement() { + checkVariableExpr("a.kappa-- + --a.kappa", 0); + } + private void checkErrorExpr(String input, String error) { Throwable t = null; try { diff --git a/frysk-core/frysk/expr/TestbedSymTab.java b/frysk-core/frysk/expr/TestbedSymTab.java index 88c1994..556c653 100644 --- a/frysk-core/frysk/expr/TestbedSymTab.java +++ b/frysk-core/frysk/expr/TestbedSymTab.java @@ -63,12 +63,14 @@ class TestbedSymTab implements ExprSymTab { .addMember("alpha", scratchSourceLocation, StandardTypes.INT32B_T, 0, null) .addMember("beta", scratchSourceLocation, StandardTypes.INT32B_T, 4, null) .addMember("gamma", scratchSourceLocation, StandardTypes.INT16B_T, 8, null) + .addMember("kappa", scratchSourceLocation, StandardTypes.INT32B_T, 12, null) .addBitFieldMember("iota", scratchSourceLocation, StandardTypes.INT32B_T, 8, null, 16, 8) // 0x0000ff00 .addBitFieldMember("epsilon", scratchSourceLocation, StandardTypes.INT32B_T, 8, null, 24, 8); // 0x000000ff private byte[] buf = { 0x01, 0x02, 0x03, 0x04, // alpha 0x05, 0x06, 0x07, 0x08, // beta - 0x09, 0x10, 0x11, 0x12 // gama, iota, epsilon + 0x09, 0x10, 0x11, 0x12, // gama, iota, epsilon + 0x00, 0x00, 0x00, 0x01 // kappa }; private Value c1 = new Value(classType, new ScratchLocation(buf)); hooks/post-receive -- frysk system monitor/debugger