Ported remaining XPath parsing bits to ruby-ll.
Currently all operators are left-associative with no particular precedence. This causes a few specs to fail for now. Outside of that the new parser should be able to parse the same input as the Racc based parser.
This commit is contained in:
parent
194d981996
commit
0fa9d4df88
|
@ -21,18 +21,53 @@ xpath
|
|||
;
|
||||
|
||||
expression
|
||||
= expression_member operator
|
||||
= expression_or_operator optional_operator_recurse
|
||||
{
|
||||
val[1] ? s(val[1][0], val[0], val[1][1]) : val[0]
|
||||
}
|
||||
;
|
||||
|
||||
expression_or_operator
|
||||
= expression_member optional_operator
|
||||
{
|
||||
val[1] ? s(val[1][0], val[0], val[1][1]) : val[0]
|
||||
}
|
||||
;
|
||||
|
||||
expression_member
|
||||
= relative_path { val[0] }
|
||||
| absolute_path { val[0] }
|
||||
| string { val[0] }
|
||||
| number { val[0] }
|
||||
| variable { val[0] }
|
||||
= relative_path { val[0] }
|
||||
| absolute_path { val[0] }
|
||||
| string { val[0] }
|
||||
| number { val[0] }
|
||||
| variable { val[0] }
|
||||
| T_LPAREN expression T_RPAREN { val[1] }
|
||||
;
|
||||
|
||||
optional_operator_recurse
|
||||
= operator expression_or_operator
|
||||
| _ { nil }
|
||||
;
|
||||
|
||||
optional_operator
|
||||
= operator expression_member
|
||||
| _ { nil }
|
||||
;
|
||||
|
||||
operator
|
||||
= T_PIPE { :pipe }
|
||||
| T_AND { :and }
|
||||
| T_OR { :or }
|
||||
| T_ADD { :add }
|
||||
| T_DIV { :div }
|
||||
| T_MOD { :mod }
|
||||
| T_EQ { :eq }
|
||||
| T_NEQ { :neq }
|
||||
| T_LT { :lt }
|
||||
| T_GT { :gt }
|
||||
| T_LTE { :lte }
|
||||
| T_GTE { :gte }
|
||||
| T_MUL { :mul }
|
||||
| T_SUB { :sub }
|
||||
;
|
||||
|
||||
# A, A/B, etc
|
||||
|
@ -142,24 +177,6 @@ axis_follow
|
|||
| _
|
||||
;
|
||||
|
||||
operator
|
||||
= T_PIPE expression { [:pipe, val[1]] }
|
||||
| T_AND expression { [:and, val[1]] }
|
||||
| T_OR expression { [:or, val[1]] }
|
||||
| T_ADD expression { [:add, val[1]] }
|
||||
| T_DIV expression { [:div, val[1]] }
|
||||
| T_MOD expression { [:mod, val[1]] }
|
||||
| T_EQ expression { [:eq, val[1]] }
|
||||
| T_NEQ expression { [:neq, val[1]] }
|
||||
| T_LT expression { [:lt, val[1]] }
|
||||
| T_GT expression { [:gt, val[1]] }
|
||||
| T_LTE expression { [:lte, val[1]] }
|
||||
| T_GTE expression { [:gte, val[1]] }
|
||||
| T_MUL expression { [:mul, val[1]] }
|
||||
| T_SUB expression { [:sub, val[1]] }
|
||||
| _ { nil }
|
||||
;
|
||||
|
||||
string
|
||||
= T_STRING { s(:string, val[0]) };
|
||||
|
||||
|
|
Loading…
Reference in New Issue