From 588fa7653021a738988f451017784c2dfb770c6e Mon Sep 17 00:00:00 2001 From: Rajith Vidanaarachchi Date: Fri, 8 Jul 2016 19:14:28 +0530 Subject: [PATCH 1/5] Ruby wrapper for parser --- ext/symengine/ruby_utils.c | 13 +++++++++++++ ext/symengine/ruby_utils.h | 1 + ext/symengine/symengine.c | 3 +++ 3 files changed, 17 insertions(+) diff --git a/ext/symengine/ruby_utils.c b/ext/symengine/ruby_utils.c index 24ec50d..ed56dbd 100644 --- a/ext/symengine/ruby_utils.c +++ b/ext/symengine/ruby_utils.c @@ -14,3 +14,16 @@ VALUE cutils_sympify(VALUE self, VALUE operand) return result; } + +VALUE cutils_parse(VALUE self, VALUE str) +{ + VALUE result; + basic_struct *cbasic_result = basic_new_heap(); + + char *cstr = RSTRING_PTR(str); + basic_parse(cbasic_result, cstr); + + result = Data_Wrap_Struct(Klass_of_Basic(cbasic_result), NULL, + cbasic_free_heap, cbasic_result); + return result; +} diff --git a/ext/symengine/ruby_utils.h b/ext/symengine/ruby_utils.h index de004ff..b283080 100644 --- a/ext/symengine/ruby_utils.h +++ b/ext/symengine/ruby_utils.h @@ -5,5 +5,6 @@ // Returns the Ruby Value after going through sympify VALUE cutils_sympify(VALUE self, VALUE operand); +VALUE cutils_parse(VALUE self, VALUE str); #endif // RUBY_UTILS_H_ diff --git a/ext/symengine/symengine.c b/ext/symengine/symengine.c index 98908f7..6a61229 100644 --- a/ext/symengine/symengine.c +++ b/ext/symengine/symengine.c @@ -58,6 +58,9 @@ void Init_symengine() rb_define_module_function(m_symengine, "convert", cutils_sympify, 1); rb_define_global_function("SymEngine", cutils_sympify, 1); + // Parser as a Module Level Function + rb_define_module_function(m_symengine, "parse", cutils_parse, 1); + // Symbol class c_symbol = rb_define_class_under(m_symengine, "Symbol", c_basic); rb_define_alloc_func(c_symbol, cbasic_alloc); From cf7748704d55f76e1822ca79907735b44e95ba4b Mon Sep 17 00:00:00 2001 From: Rajith Vidanaarachchi Date: Fri, 8 Jul 2016 20:37:14 +0530 Subject: [PATCH 2/5] Update symengine version --- symengine_version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/symengine_version.txt b/symengine_version.txt index bc0c91d..6e61f5d 100644 --- a/symengine_version.txt +++ b/symengine_version.txt @@ -1 +1 @@ -0c17ca9d88f25881c6d0ca382c26b2eb392b9b48 +bb18f1c1f4cbc29765fe1bcbd2dbe9345279b659 From 300c76974e8f63ea814576b81f205b06fb90c760 Mon Sep 17 00:00:00 2001 From: Rajith Vidanaarachchi Date: Fri, 8 Jul 2016 20:56:57 +0530 Subject: [PATCH 3/5] testing parse method --- spec/symengine_spec.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spec/symengine_spec.rb b/spec/symengine_spec.rb index 0f1017a..72ff370 100644 --- a/spec/symengine_spec.rb +++ b/spec/symengine_spec.rb @@ -18,5 +18,12 @@ it { is_expected.to be_a SymEngine::Rational } its(:to_s) { is_expected.to eq '1/3' } end + + describe 'parse' do + subject { SymEngine::parse('123 + 321') } + + it { is_expected.to be_a SymEngine::Integer } + it { is_expected.to eq 444 } + end end From c20e7a0618258d6d5b6bee67f81cac89e3475686 Mon Sep 17 00:00:00 2001 From: Rajith Vidanaarachchi Date: Sun, 21 Aug 2016 20:17:36 +0530 Subject: [PATCH 4/5] Exception Handling and test with parse error --- ext/symengine/ruby_utils.c | 13 +++++++++---- spec/symengine_spec.rb | 4 ++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/ext/symengine/ruby_utils.c b/ext/symengine/ruby_utils.c index 2dd8d94..b2dc67b 100644 --- a/ext/symengine/ruby_utils.c +++ b/ext/symengine/ruby_utils.c @@ -16,14 +16,19 @@ VALUE cutils_sympify(VALUE self, VALUE operand) VALUE cutils_parse(VALUE self, VALUE str) { - VALUE result; + VALUE result = Qnil; basic_struct *cbasic_result = basic_new_heap(); char *cstr = RSTRING_PTR(str); - basic_parse(cbasic_result, cstr); - result = Data_Wrap_Struct(Klass_of_Basic(cbasic_result), NULL, - cbasic_free_heap, cbasic_result); + symengine_exceptions_t error_code = basic_parse(cbasic_result, cstr); + + if (error_code == SYMENGINE_NO_EXCEPTION) { + result = Data_Wrap_Struct(Klass_of_Basic(cbasic_result), NULL, + cbasic_free_heap, cbasic_result); + } else { + raise_exception(error_code); + } return result; } diff --git a/spec/symengine_spec.rb b/spec/symengine_spec.rb index 72ff370..8dcb01b 100644 --- a/spec/symengine_spec.rb +++ b/spec/symengine_spec.rb @@ -26,4 +26,8 @@ it { is_expected.to eq 444 } end + it 'gives parse errors' do + expect { SymEngine::parse('12a + n34a9') }.to raise_error(RuntimeError) + end + end From 7e9ca53ffd308422254f7144795d58372658b24e Mon Sep 17 00:00:00 2001 From: Rajith Vidanaarachchi Date: Mon, 22 Aug 2016 15:16:53 +0530 Subject: [PATCH 5/5] Added more tests for parser --- spec/symengine_spec.rb | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/spec/symengine_spec.rb b/spec/symengine_spec.rb index 8dcb01b..306ef52 100644 --- a/spec/symengine_spec.rb +++ b/spec/symengine_spec.rb @@ -29,5 +29,41 @@ it 'gives parse errors' do expect { SymEngine::parse('12a + n34a9') }.to raise_error(RuntimeError) end + + describe 'parse an Add' do + subject { SymEngine::parse('x + (y * 3 - 5)') } + + it { is_expected.to be_a SymEngine::Add } + end + + describe 'parse a Pow' do + subject { SymEngine::parse('x ** y') } + + it { is_expected.to be_a SymEngine::Pow } + end + + describe 'parse rational values' do + subject { SymEngine::parse('1 / 3 + 3 / 2') } + + it { is_expected.to eq SymEngine(11)/SymEngine(6) } + end + + describe 'parse integer expressions' do + subject { SymEngine::parse('1 + 2 * 2') } + + it { is_expected.to eq 5 } + end + + describe 'parse trig functions' do + subject { SymEngine::parse('sin(x) + cos(y) / 2') } + + it { is_expected.to be_a SymEngine::Add } + end + + describe 'parse functions' do + subject { SymEngine::parse('tan(0) - sqrt(2)') } + + it { is_expected.to be_a SymEngine::Mul } + end end