[antlr-interest] Antlr3: Help - line 0:-1 mismatched input '<EOF>' ?
Mark Mandel
mark.mandel at gmail.com
Sun Jan 7 21:32:29 PST 2007
Hey all -
I'm still working on my HQL like syntax, just being very basic at the
moment, just parsing a statement that looks like, to get a flat AST
tree.
"select emails.Email.emailName, emails.Email.emailFrom from
emails.Email where emails.Email.emailName = :name";
To get my feet wet and get going.
I've been following the XML Parser tutorial pretty closely on a lot of
things, and it's been a great help.
I get the error:
line 0:-1 mismatched input '<EOF>' expecting SELECT
Whenever I run my parser over my tokens, and I have no idea why. Is
line:0:-1 at the beginning or the end of the string?
I've gone hunting as much as I can, but I have yet to find anything
that tells me where I should be looking to solve this issue.
Any and all help is appreciated.
My grammar and test bed is the following:
[Test.java]
public static void main(String[] args)
{
try
{
String tql = "select emails.Email.emailName, emails.Email.emailFrom
from emails.Email where emails.Email.emailName = :name";
System.out.println(tql);
CharStream input = new ANTLRStringStream(tql);
TqlLexerLexer lexer = new TqlLexerLexer(input);
Token token;
while ((token = lexer.nextToken())!=Token.EOF_TOKEN) {
System.out.println("Token["+ token.getType() +"]: "+token.getText());
}
CommonTokenStream tokens = new CommonTokenStream(lexer);
TqlParserParser parser = new TqlParserParser(tokens);
TqlParserParser.selectStatement_return root = parser.selectStatement();
System.out.println("tree="+((Tree)root.tree).toStringTree());
}
catch(Throwable t)
{
System.out.println("Exception: "+t.getMessage());
t.printStackTrace();
}
}
[TqlParser.g]
parser grammar TqlParser;
options
{
tokenVocab=TqlLexer;
output=AST;
}
selectStatement
:
selectExpression
;
selectExpression
:
selectHeader
fromStatement
whereStatement
;
selectHeader
:
SELECT PROPERTY_IDENTIFIER (COMMA PROPERTY_IDENTIFIER)*
;
fromStatement
:
FROM CLASS_IDENTIFIER (COMMA CLASS_IDENTIFIER)*
;
whereStatement
:
WHERE PROPERTY_IDENTIFIER OPERATOR MAPPED_VALUE
;
[TqlLexer.g]
lexer grammar TqlLexer;
@members {
private static final int STRING_MODE = 1;
private static final int PROPERTY_IDENTIFIER_MODE = 2;
private static final int CLASS_IDENTIFIER_MODE = 3;
private int currentMode = STRING_MODE;
private int pastMode;
private void setMode(int mode)
{
pastMode = currentMode;
currentMode = mode;
}
}
SELECT :
{ currentMode == STRING_MODE }?=>
'select'
{ setMode(PROPERTY_IDENTIFIER_MODE); }
;
FROM :
{ currentMode == STRING_MODE }?=>
'from'
{ setMode(CLASS_IDENTIFIER_MODE); }
;
WHERE :
{ currentMode == STRING_MODE }?=>
'where'
{ setMode(PROPERTY_IDENTIFIER_MODE); }
;
COMMA :
','
{ setMode(pastMode); }
;
OPERATOR
:
'='|'>'|'<'|'!='|'<>'|'>='|'<='
;
MAPPED_VALUE
:
':'(LETTER|DIGIT|'_')+
;
CLASS_IDENTIFIER
:
{ currentMode == CLASS_IDENTIFIER_MODE }?=>
IDENTIFIER
{ setMode(STRING_MODE); }
;
PROPERTY_IDENTIFIER
:
{ currentMode == PROPERTY_IDENTIFIER_MODE }?=>
IDENTIFIER
{ setMode(STRING_MODE); }
;
WS :
(' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}
;
fragment IDENTIFIER
:
LETTER(LETTER|DIGIT|'.'|'_')+
;
fragment DIGIT
:
'0'..'9'
;
fragment LETTER
:
'a'..'z'| 'A'..'Z'
;
Again, any help would be appreciated.
Regards,
Mark
--
E: mark.mandel at gmail.com
W: www.compoundtheory.com
More information about the antlr-interest
mailing list