blob: 3500ea4e8e665fd717e61ef4b6476d01575a1ac4 [file] [log] [blame]
grammar FilterParser;
options {
language = Java;
output = AST;
ASTLabelType = CommonTree;
}
tokens {
LOGICAL;
ROOT1;
ROOT2;
OPERATION;
OPERATION1;
OPERATION2;
OPERATION3;
OPERATION4;
OPERATION5;
CONSTANT;
PAR_CONSTANT;
}
@header {
/*******************************************************************************
* Copyright (c) 2018 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Jean-Christian Kouame - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.tmf.filter.parser;
import org.eclipse.tracecompass.tmf.filter.parser.error.IErrorListener;
}
@members {
private IErrorListener errListener;
public void setErrorListener(IErrorListener listener) {
errListener = listener;
}
@Override
public void reportError(RecognitionException e) {
errListener.error(e);
}
}
@lexer::header {
/*******************************************************************************
* Copyright (c) 2018 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Jean-Christian Kouame - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.tmf.filter.parser;
import org.eclipse.tracecompass.tmf.filter.parser.error.IErrorListener;
}
@lexer::members {
private IErrorListener errListener;
public void setErrorListener(IErrorListener listener) {
errListener = listener;
}
@Override
public void reportError(RecognitionException e) {
errListener.error(e);
}
}
parse: (parseRoot)+;
parseRoot: root (SEPARATOR root)* -> ^(LOGICAL root (SEPARATOR root)*);
root : (OP_NEGATE)? start = '(' parseRoot close = ')' -> ^(ROOT1 (OP_NEGATE)? $start parseRoot $close)
| (OP_NEGATE)? (expression) -> ^(ROOT2 (OP_NEGATE)? expression);
SEPARATOR :'||' | '&&';
paragraph : TEXT+;
expression :TEXT OP TEXT -> ^(OPERATION TEXT OP TEXT)
| TEXT OP_PRESENT -> ^(OPERATION1 TEXT OP_PRESENT)
| '"' key0 = paragraph '"' op = OP text = TEXT -> ^(OPERATION2 $key0 $op $text)
| '"' key1 = paragraph '"' op_present = OP_PRESENT -> ^(OPERATION3 $key1 $op_present)
| TEXT OP '"' paragraph '"' -> ^(OPERATION4 TEXT OP paragraph)
| '"' key3 = paragraph '"' OP '"' key4 = paragraph '"' -> ^(OPERATION5 $key3 OP $key4)
| TEXT -> ^(CONSTANT TEXT)
| '"' paragraph '"' -> ^(PAR_CONSTANT paragraph);
OP_PRESENT : 'present';
OP_NEGATE : '!';
OP : '==' | '!=' | 'contains' | 'matches' | '>' | '<';
TEXT : (('a'..'z')|('A'..'Z')|('0'..'9')|'-'|'_'|'['|']'|'.'|'*'|'$'|'^'|'|'|'\\'|'{'|'}'|'?'|'+'|':'|';')+;
WS : (' '|'\t'|'\r'|'\n')+ { skip(); } ;