i am creating two rules and using two rules in a new rule. grammar file is
// Filter.g4
grammar Filter;
// Tokens.
// LSTRING: ('a'..'z'| 'A'..'Z')+;
CONJUNCTION: 'AND'|'OR';
AND: 'AND';
META: ('meta.'('a'..'z'| 'A'..'Z'|'\\'|'/'|'_')+);
OBJECT: (('a'..'z'| 'A'..'Z'|'\\'|'/'|'_')+);
OPERATOR: '=';
WHITESPACE: [ \r\n\t]+ -> skip;
NOT: 'NOT';
OPEN_CURLY: '(';
CLOSE_CURLY: ')';
fragment STRING:'"' (ESC|.)*? '"';
fragment UNICODE : ('\u0000'..'\u00FF')+;
fragment NUMBER: [0-9.]+;
fragment BOOL: 'true'|'false';
fragment ESC : '\\"' | '\\\\' ;
VALUE: STRING | NUMBER | BOOL;
metaExpression
: META OPERATOR VALUE #metaComparison
| metaExpression CONJUNCTION metaExpression #metaOperation
| OPEN_CURLY metaExpression CLOSE_CURLY #metaNestedComparisons
;
fieldExpression
: OBJECT #fieldLiteral
| OBJECT OPERATOR VALUE #fieldComparison
| fieldExpression CONJUNCTION fieldExpression #fieldOperation
| OPEN_CURLY fieldExpression CLOSE_CURLY #fieldNestedComparisons
;
// Rules.
start: expression EOF;
expression
: metaExpression #metaExp
| metaExpression AND fieldExpression #operation
| OPEN_CURLY expression CLOSE_CURLY #nestedComparisons
;
// Parse
func Parse(input string) (string, string, error) {
// Setup the input.
is := antlr.NewInputStream(input)
// Create the Lexer.
lexer := parser.NewFilterLexer(is)
stream := antlr.NewCommonTokenStream(lexer, antlr.TokenDefaultChannel)
// Create the Parser.
p := parser.NewFilterParser(stream)
// Finally parse the expression (by walking the tree).
listener := filterListener{}
// Add err listener for the parser.
p.AddErrorListener(&listener.errorListener)
antlr.ParseTreeWalkerDefault.Walk(&listener, p.Start())
// return the err message on encountering
// err while parsing.
if listener.errorListener.err != nil {
return "", "", listener.errorListener.err
}
return "", "", nil
}
func main() {
// q := `meta.test="125"` // success
//q := `meta.test="125" AND meta.merrrr="myself"` // success
// q := `(meta.test="125" AND meta.merrrr="myself")` // success
//q := `(meta.test="125" AND meta.merrrr="myself") AND field="other"` // failure
q := `meta.test="125" AND meta.merrrr="myself" AND field="other"` // failure
Parse(q)
}
Few expressions are failing with no viable alternative at input. expecting the failed expressions should match metaExpression AND fieldExpression #operation.