+++ /dev/null
-/*--------------------------------------------------------------------------\r
- * Copyright 2009 Taro L. Saito\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *--------------------------------------------------------------------------*/\r
-//--------------------------------------\r
-// XerialJ\r
-//\r
-// XPath.g\r
-// Since: Aug 6, 2009 08:30:02 AM\r
-//\r
-//--------------------------------------\r
- \r
-grammar XPath;\r
-options \r
-{\r
- language=Java;\r
- output=AST;\r
-}\r
-tokens {\r
- XPATH;\r
- NAME;\r
- VALUE;\r
- STEP;\r
- AXIS;\r
- PREDICATE;\r
-}\r
-\r
-@lexer::header\r
-{\r
-/*--------------------------------------------------------------------------\r
- * Copyright 2009 Taro L. Saito\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *--------------------------------------------------------------------------*/\r
-//--------------------------------------\r
-// XerialJ\r
-//\r
-// XPathLexer.g\r
-// Since: Aug 6, 2009 08:30:02 AM\r
-//\r
-//--------------------------------------\r
-\r
-package org.xerial.lens.relation.query.impl;\r
-\r
-}\r
-\r
- \r
-@header\r
-{\r
-/*--------------------------------------------------------------------------\r
- * Copyright 2009 Taro L. Saito\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *--------------------------------------------------------------------------*/\r
-//--------------------------------------\r
-// XerialJ\r
-//\r
-// XPathParser.g\r
-// Since: Aug 6, 2009 08:30:02 AM\r
-//\r
-//--------------------------------------\r
-package org.xerial.lens.relation.query.impl;\r
-\r
-\r
-}\r
-\r
-@lexer::members {\r
-\r
-}\r
-\r
-@members {\r
-\r
-} \r
-\r
-//-------------------------\r
-// lexer rules\r
-//-------------------------\r
-\r
-// Line Comment\r
-fragment LineBreakChar: '\n' | '\r'; // r: <CR> n : <LF>\r
-LineComment: '#' ~(LineBreakChar)* { $channel = HIDDEN; };\r
-\r
-LineBreak: ('\r' '\n' | '\r' | '\n' ) { $channel = HIDDEN; }; \r
-\r
-fragment Digit: '0' .. '9';\r
-fragment Letter: 'A' .. 'F' | 'a' .. 'f';\r
-fragment HexDigit: Digit | Letter;\r
-fragment UnicodeChar: ~('"'| '\\');\r
-fragment EscapeSequence\r
- : '\\' ('\"' | '\\' | '/' | 'b' | 'f' | 'n' | 'r' | 't' | 'u' HexDigit HexDigit HexDigit HexDigit)\r
- ; \r
-\r
-fragment StringChar : UnicodeChar | EscapeSequence;\r
-fragment StringChar_s: StringChar*;\r
-\r
-String: '"' s=StringChar_s '"' { setText($s.text); };\r
-\r
-Integer: '-'? ('0' | '1'..'9' Digit*);\r
-fragment Frac: '.' Digit+;\r
-fragment Exp: ('e' | 'E') ('+' | '-')? Digit+;\r
-Double: Integer (Frac Exp? | Exp);\r
-\r
-// comparison operator\r
-\r
-Comma: ',';\r
-Colon: ':';\r
-\r
-\r
-\r
-fragment\r
-UnsafeUnicodeChar: '(' | ')' | '[' | ']' | '{' | '}' | ',' | ':' | '#' | '<' | '>' | '|' | '*' | '\'' | '"' | '@' | '%' | '\\' | '.' | '-'; \r
-\r
-fragment SafeFirstLetter: 'A' .. 'Z' | 'a' .. 'z';\r
-fragment SafeLetter: SafeFirstLetter | '0' .. '9' | '-' | '_';\r
-\r
-fragment QNameChar: ~(LineBreakChar | UnsafeUnicodeChar | WhiteSpace | '/' | '//');\r
-QName: QNameChar+ ('.' QNameChar+)*;\r
-\r
-\r
-fragment \r
-WhiteSpace: ' ' | '\t';\r
- \r
-WhiteSpaces: WhiteSpace+ { $channel = HIDDEN; }; \r
-\r
-\r
-\r
-//---------------------------\r
-// parser rules\r
-//---------------------------\r
-\r
-xpath\r
- : locationExpr\r
- -> ^(XPATH locationExpr)\r
- ; \r
-\r
-fragment\r
-locationExpr\r
- : relativePath\r
- ;\r
- \r
-fragment\r
-relativePath\r
- : step relativePath?\r
- -> ^(STEP step relativePath?)\r
- | '/' step relativePath?\r
- -> ^(STEP AXIS["PC"] step relativePath?)\r
- | '//' step relativePath?\r
- -> ^(STEP AXIS["AD"] step relativePath?)\r
- ; \r
-\r
- \r
-fragment\r
-step\r
- : nodeTest predicate* -> NAME[$nodeTest.text] predicate* \r
- ;\r
-\r
- \r
-fragment\r
-nodeTest\r
- : '@'? (QName ':')? QName \r
- ; \r
-\r
-fragment\r
-predicate\r
- : '[' expr ']'\r
- -> ^(PREDICATE expr)\r
- ;\r
-\r
-expr\r
- : comparisonExpr\r
- ;\r
-\r
-fragment\r
-comparisonExpr\r
- : pathExpr\r
- | (pathExpr '=') => pathExpr '=' pathExpr\r
- | (pathExpr '!=') => pathExpr '!=' pathExpr\r
- | (pathExpr '>') => pathExpr '>' pathExpr\r
- | (pathExpr '>=') => pathExpr '>=' pathExpr\r
- | (pathExpr '<') => pathExpr '<' pathExpr\r
- | (pathExpr '<=') => pathExpr '<=' pathExpr\r
- | (pathExpr '~=') => pathExpr '~=' pathExpr\r
- ;\r
-\r
-\r
-fragment\r
-pathExpr\r
- : locationExpr\r
- | primaryExpr \r
- ;\r
- \r
-fragment\r
-primaryExpr\r
- : String\r
- | Integer\r
- | Double\r
- | functionCall \r
- ;\r
- \r
-\r
-fragment\r
-functionCall\r
- : QName '(' (expr (',' expr)*)? ')'\r
- ; \r
- \r
-
\ No newline at end of file