[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