blob: 5718a77d6751fb3169987d999c48bedc1ff06610 [file] [log] [blame]
/*
* Copyright 2013 SFB 632.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
parser grammar AqlParser;
@header {package de.ids_mannheim.korap.query.parse.annis;}
options
{
language=Java;
tokenVocab=AqlLexer;
}
// the following start rule should end with an EOF: "(exprTop | regex) EOF". However, this causes
// trouble with "qName operator textSpec" specifications at the end of the input (see variableExpr rule), while "TOK operator textSpec"
// works fine, for a strange reason. Until this is further investigated, go without EOF
start
: (exprTop | regex) EOF
;
regex : REGEX;
textSpec
: START_TEXT_PLAIN END_TEXT_PLAIN # EmptyExactTextSpec
| START_TEXT_PLAIN content=TEXT_PLAIN END_TEXT_PLAIN # ExactTextSpec
| regex # RegexTextSpec
//| START_TEXT_REGEX END_TEXT_REGEX #EmptyRegexTextSpec
//| START_TEXT_REGEX content=TEXT_REGEX END_TEXT_REGEX # RegexTextSpec
//| SLASH content=TEXT_REGEX SLASH # RegexTextSpec
//| SLASH SLASH #EmptyRegexTextSpec
;
eqOperator
: EQ
| NEQ
;
rangeSpec
: min=DIGITS (COMMA max=DIGITS)?
;
qName
: foundry layer
| layer
;
edgeType
: ID;
edgeAnno
: ((foundry layer? COLON)? key eqOperator)? textSpec
;
edgeSpec
: BRACKET_OPEN edgeAnno BRACKET_CLOSE
;
refOrNode
: REF # ReferenceRef
| VAR_DEF? variableExpr # ReferenceNode
;
precedence
: PRECEDENCE (layer)? # DirectPrecedence
| PRECEDENCE (layer)? STAR # IndirectPrecedence
| PRECEDENCE (layer COMMA?)? rangeSpec #RangePrecedence
;
dominance
: DOMINANCE (edgeType)? (LEFT_CHILD | RIGHT_CHILD)? (anno=edgeSpec)? # DirectDominance
| DOMINANCE (edgeType)? STAR # IndirectDominance
| DOMINANCE (edgeType)? rangeSpec? # RangeDominance
;
pointing
: POINTING qName (anno=edgeSpec)? # DirectPointing
| POINTING qName (anno=edgeSpec)? STAR # IndirectPointing
| POINTING qName (anno=edgeSpec)? COMMA? rangeSpec # RangePointing
;
spanrelation
: IDENT_COV # IdenticalCoverage
| LEFT_ALIGN # LeftAlign
| RIGHT_ALIGN # RightAlign
| INCLUSION # Inclusion
| OVERLAP # Overlap
| RIGHT_OVERLAP # RightOverlap
| LEFT_OVERLAP # LeftOverlap
;
commonparent
: COMMON_PARENT (label)? # CommonParentLabel
;
commonancestor
: COMMON_PARENT (label)? STAR # CommonAncestorLabel
;
identity
: IDENTITY
;
equalvalue
: EQ_VAL
;
notequalvalue
: NEQ
;
near
: NEAR (layer)? # DirectNear
| NEAR (layer)? STAR # IndirectNear
| NEAR (layer COMMA?)? rangeSpec #RangeNear
;
operator
: precedence
| spanrelation
| dominance
| pointing
| commonparent
| commonancestor
| identity
| equalvalue
| notequalvalue
| near
;
foundry
: FOUNDRY
| ID;
layer
: ID;
key
: ID;
label
: ID;
n_ary_linguistic_term
: refOrNode (operator refOrNode)+ # Relation
;
unary_linguistic_term
: left=REF ROOT # RootTerm
| left=REF ARITY EQ rangeSpec # ArityTerm
| left=REF TOKEN_ARITY EQ rangeSpec # TokenArityTerm
;
variableExpr
: qName eqOperator txt=textSpec # AnnoEqTextExpr
| TOK eqOperator txt=textSpec # TokTextExpr
| txt=textSpec # TextOnly // shortcut for tok="..."
| qName # AnnoOnlyExpr
| TOK # TokOnlyExpr
| NODE # NodeExpr
;
varDef
: VAR_DEF
;
expr
: varDef variableExpr # NamedVariableTermExpr
| variableExpr # VariableTermExpr
| unary_linguistic_term # UnaryTermExpr
| n_ary_linguistic_term # BinaryTermExpr
| META DOUBLECOLON id=qName op=EQ txt=textSpec # MetaTermExpr
;
andTopExpr
: ((expr (AND expr)*) | (BRACE_OPEN expr (AND expr)* BRACE_CLOSE)) # AndExpr
;
exprTop
: BRACE_OPEN? andTopExpr (OR andTopExpr)* BRACE_CLOSE? # OrTop
;