From d2f15e37d0bf5f6c4b0167906d179ecd81b15aa5 Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Mon, 23 Jun 2014 00:30:42 +0200 Subject: [PATCH] Corrected XPath operator precedence. The previous commit didn't fully change the operator precedence according to the XPath 1.0 specification. Also thanks to @whitequark for clearing up a few things about Racc's operator precedence system. --- lib/oga/xpath/parser.y | 6 ++++-- spec/oga/xpath/parser/operator_precedence_spec.rb | 12 ++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/oga/xpath/parser.y b/lib/oga/xpath/parser.y index f240392..19054ec 100644 --- a/lib/oga/xpath/parser.y +++ b/lib/oga/xpath/parser.y @@ -12,8 +12,10 @@ options no_result_var prechigh left T_PIPE T_MOD T_DIV T_MUL T_SUB T_ADD - left T_GT T_GTE T_LT T_LTE T_NEQ T_EQ - left T_AND T_OR + left T_LT T_LTE T_GT T_GTE + left T_EQ T_NEQ + left T_AND + left T_OR preclow rule diff --git a/spec/oga/xpath/parser/operator_precedence_spec.rb b/spec/oga/xpath/parser/operator_precedence_spec.rb index 99e107c..abed008 100644 --- a/spec/oga/xpath/parser/operator_precedence_spec.rb +++ b/spec/oga/xpath/parser/operator_precedence_spec.rb @@ -94,9 +94,9 @@ describe Oga::XPath::Parser do parse_xpath('A or B and C').should == s( :path, s( - :and, - s(:or, s(:test, nil, 'A'), s(:test, nil, 'B')), - s(:test, nil, 'C') + :or, + s(:test, nil, 'A'), + s(:and, s(:test, nil, 'B'), s(:test, nil, 'C')) ) ) end @@ -116,9 +116,9 @@ describe Oga::XPath::Parser do parse_xpath('A = B < C').should == s( :path, s( - :lt, - s(:eq, s(:test, nil, 'A'), s(:test, nil, 'B')), - s(:test, nil, 'C') + :eq, + s(:test, nil, 'A'), + s(:lt, s(:test, nil, 'B'), s(:test, nil, 'C')) ) ) end