[antlr-interest] Quoted Name Value Pairs
Jesse Anderson
jesse.anderson at 4bright.com
Tue Apr 22 15:49:28 PDT 2008
Also, here is the complete file.
grammar bcadmin;
tokens {
ADD = 'add';
REMOVE = 'remove';
SET = 'set';
LIST = 'list';
/* Possible tokens for values */
ID = 'id';
WORKSPACE = 'workspace';
TARGET = 'target';
PATTERN = 'pattern';
USER = 'user';
START = 'start';
FILESIZE = 'filesize';
THROTTLE = 'throttle';
STATUS = 'status';
}
@members {
public static void main(String[] args) throws Exception {
bcadminLexer lex = new bcadminLexer(new ANTLRFileStream(args[0]));
CommonTokenStream tokens = new CommonTokenStream(lex);
bcadminParser parser = new bcadminParser(tokens);
try {
parser.expr();
} catch (RecognitionException e) {
e.printStackTrace();
}
}
}
/*------------------------------------------------------------------
* PARSER RULES
*------------------------------------------------------------------*/
expr : ( add | remove | set | list )* ;
add : ADD addterms SEMICOLON ;
addterms : ( WHITESPACE ( WORKSPACE | TARGET | PATTERN | USER |
START | FILESIZE | THROTTLE | STATUS ) equalsvalue )* ;
remove : REMOVE removeterms SEMICOLON ;
removeterms : WHITESPACE ID equalsvalue ;
set : SET setterms SEMICOLON ;
setterms : ( WHITESPACE ( ID | WORKSPACE | TARGET | PATTERN | USER |
START | FILESIZE | THROTTLE | STATUS ) equalsvalue )* ;
list : LIST listterms SEMICOLON ;
listterms : ( WHITESPACE WORKSPACE equalsvalue )? ;
equalsvalue : EQUALS QUOTEDVALUE ;
/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
QUOTEDVALUE : '"' (~'"')* '"' ;
WHITESPACE : WHITESPACECHAR+ ;
WHITESPACECHAR : ( '\t' | ' ' | '\r' | '\n'| '\u000C' ) ;
EQUALS : ( '=' ) ;
SEMICOLON : ( ';' )+ ;
Jesse Anderson wrote:
> Gavin Lambert wrote:
>> At 07:29 23/04/2008, Jesse Anderson wrote:
>> >Here is my file:
>>
>> You've left some of the rules out, so it's hard to give a complete
>> answer. But for starters:
>>
>> >WHITESPACE : WHITESPACECHAR+ ;
>> >
>> >WHITESPACECHAR : ( '\t' | ' ' | '\r' | '\n'| '\u000C' ) ;
>>
>> WHITESPACECHAR should be a fragment.
>>
>> >SEMICOLON : ( ';' )* ;
>>
>> This permits SEMICOLON to match nothing, and lexer rules that can
>> match nothing are a big no-no. Either change the * to a + or remove
>> it entirely and match multiple SEMICOLON tokens in the parser.
>>
>> When you're starting out, it's useful to write a test harness for the
>> lexer alone; feed it some sample input and print out the tokens it
>> generates. You'll often find that the parser isn't behaving the way
>> you expect because it's getting different tokens than you expect.
>> ANTLRworks currently doesn't really show this very well.
>>
> I tried that. Still no joy. I changed it to:
>
> SEMICOLON : ( ';' )+;
More information about the antlr-interest
mailing list