Support for lexing/parsing XPath type tests.

Unlike what I thought before syntax such as "node()" is not a function call.
Instead this is a special node test that tests the *types* of nodes, not their
names.
This commit is contained in:
Yorick Peterse committed 2014-08-14 21:51:58 +02:00
1 parent 23441bb5a4
commit 6ad5170476
7 files changed
+77 -25

No files matched your search

+16 -3
View File
@@ -249,9 +249,7 @@ module Oga
# added on lexer level to make it easier to handle these cases on
# parser/evaluator level.
if AXIS_EMIT_NODE.include?(value)
add_token(:T_IDENT, 'node')
add_token(:T_LPAREN)
add_token(:T_RPAREN)
add_token(:T_NODE_TYPE, 'node')
if AXIS_EMIT_EXTRA_SLASH.include?(value) and te != eof
add_token(:T_SLASH)
@@ -305,10 +303,25 @@ module Oga
| op_sub
;
# Node types
#
# While these look like functions they are actually node tests. For
# example, comment() matches all comment nodes.
#
# See http://www.w3.org/TR/xpath/#NT-NodeType for more information.
node_type = 'comment' | 'text' | 'processing-instruction' | 'node';
action emit_node_type {
emit(:T_NODE_TYPE, ts, te - 2)
}
main := |*
operator;
whitespace | slash | lparen | rparen | comma | colon;
node_type '()' => emit_node_type;
'[' => { add_token(:T_LBRACK) };
']' => { add_token(:T_RBRACK) };
+6 -1
View File
@@ -3,7 +3,7 @@
#
class Oga::XPath::Parser
token T_AXIS T_COLON T_COMMA T_FLOAT T_INT T_IDENT
token T_AXIS T_COLON T_COMMA T_FLOAT T_INT T_IDENT T_NODE_TYPE
token T_LBRACK T_RBRACK T_LPAREN T_RPAREN T_SLASH T_STRING
token T_PIPE T_AND T_OR T_ADD T_DIV T_MOD T_EQ T_NEQ T_LT T_GT T_LTE T_GTE
token T_SUB T_MUL
@@ -76,6 +76,11 @@ rule
node_test
: node_name { s(:test, *val[0]) }
| node_name predicate { s(:test, *val[0], val[1]) }
| node_type { val[0] }
;
node_type
: T_NODE_TYPE { s(:node_type, val[0]) }
;
node_name