1
votes

I have a simple grammar defined in Antlr 3 as shown below:

grammar StringProcessor;

options {
output=AST;
}

@header {
package com.processor;
}

@rulecatch {
    // ANTLR does not generate its normal rule try/catch
    catch(RecognitionException e) {
    throw e;
}
}

truevalue   : 'true';
falsevalue  : 'false';
nullvalue   : 'null';
simpleValue : truevalue | falsevalue | nullvalue | STRING | INTEGER | FLOAT;
INTEGER     : '0'..'9'+;
FLOAT       : INTEGER'.'INTEGER;
QUOTE       : '"';
SPECIALCHAR : '-'|':'|';'|'('|')'|'£'|'&'|'@'|','|'!'|'['|']'|'{'|'}'|'#'|'^'|'*'|'+'|'='|'_'|'<'|'>'|'€'|'$'|'%'|'/'|'.'|'?'|'~'|'|';
STRING  : QUOTE('a'..'z'|'A'..'Z'|INTEGER|SPECIALCHAR|WS)+QUOTE;
WS      : (' '|'\t'|'\f'|'\n'|'\r')+ {skip();}; // handle white space between keywords

When I try the following STRING in AntlrWorks in the intrepreter:

"5Java Developer"

This works. It includes the white space. But when I try to parse this from the Java program, it throws a NoViableAltException. I have seen other posts, but those solutions does not apply to my problem. The WS is part of the STRING. The problem is Java program does not parse anything with a white space, whereas the interprets displays correctly.

An example to show the Exception:

public static void main(String[] args) throws Exception {
    String input = ("\"5Java Developer\"");
    StringProcessorParser parser = buildParser(input);
    CommonTree commonTree = (CommonTree) parser.simpleValue().getTree(); // exception thrown
}

public static StringProcessorParser buildParser(String query) {
    CharStream cs = new ANTLRStringStream(query);
    // the input needs to be lexed
    StringProcessorLexer lexer = new StingProcessorLexer(cs);
    CommonTokenStream tokens = new CommonTokenStream();
    StringProcessorParser parser = new StringProcessorParser(tokens);
    tokens.setTokenSource(lexer);
    // use the ASTTreeAdaptor so that the grammar is aware to build tree in AST format
    parser.setTreeAdaptor((TreeAdaptor) new ASTTreeAdaptor().getASTTreeAdaptor());
    return parser;
}

Having:

    input = new String("\"5JavaDeveloper\""); correctly parses.

Any idea why this is not working.

EDIT:

I have also tried adding the $channel = HIDDEN;

But still it does not work

WS : (' '|'\t'|'\f'|'\n'|'\r')+ { $channel = HIDDEN; skip();}; // handle white space between keywords
1

1 Answers

0
votes

Removing the skip() has fixed my problem.