This is freaking me out, I just can't find a solution to it. I have a grammar for search queries and would like to match any searchterm in a query composed out of printable letters except for special characters "(", ")". Strings enclosed in quotes are handled separately and work.
Here is a somewhat working grammar:
/* ANTLR Grammar for Minidb Query Language */ grammar Mdb; start : searchclause EOF ; searchclause : table expr ; expr : fieldsearch | searchop fieldsearch | unop expr | expr relop expr | lparen expr relop expr rparen ; lparen : '(' ; rparen : ')' ; unop : NOT ; relop : AND | OR ; searchop : NO | EVERY ; fieldsearch : field EQ searchterm ; field : ID ; table : ID ; searchterm : | STRING | ID+ | DIGIT+ | DIGIT+ ID+ ; STRING : '"' ~(' '|'"')* ('"' ) ; AND : 'and' ; OR : 'or' ; NOT : 'not' ; NO : 'no' ; EVERY : 'every' ; EQ : '=' ; fragment VALID_ID_START : ('a' .. 'z') | ('A' .. 'Z') | '_' ; fragment VALID_ID_CHAR : VALID_ID_START | ('0' .. '9') ; ID : VALID_ID_START VALID_ID_CHAR* ; DIGIT : ('0' .. '9') ; /* NOT_SPECIAL : ~(' ' | '\t' | ' ' | '' | '\'' | '"' | ';' | '.' | '=' | '(' | ')' ) ; */ WS : [ \t] + -> skip ;
The problem is that searchterm is too restricted. It should match any character that is in the commented out NOT_SPECIAL, i.e., valid queries would be:
Person Name=% Person Address=^%Street%%%$^&*@^
But whenever I try to put NOT_SPECIAL in any way into the definition of searchterm it doesn't work. I have tried putting it literally into the rule, too (commenting out NOT_SPECIAL) and many others things, but it just doesn't work. In most of my attempts the grammar just complained about extraneous input after "=" and said it was expecting EOF. But I also cannot put EOF into NOT_SPECIAL.
Is there any way I can simply parse every text after "=" in rule fieldsearch until there is a whitespace or ")", "("?
N.B. The STRING rule works fine, but the user ought not be required to use quotes every time, because this is a command line tool and they'd need to be escaped.
Target language is Go.