[antlr-interest] Exception while trying to generate Java classes for lexer

Terence Parr parrt at cs.usfca.edu
Mon Jul 7 15:20:18 PDT 2008


Fixed.
Thanks.
Ter
On Jun 27, 2008, at 5:50 PM, Sumanto Biswas wrote:

> Hi,
>
> I have a parser-lexer combination. I used to have it together, but
> separated them so that I could have better control over options and
> also for better readability.
>
> When the lexer was part of parser, it generated fine. However, I took
> the lexer out of the parser, and tried to generate them separately,
> the parser just generated the parser.java file. When I tried to
> generate from lexer, I got the exception stack trace pasted below.
>
> The lexer is pasted below the stack trace and also attached.
>
> Thanks in advance,
> Sumanto
>
> ================================================================
> ANTLR Parser Generator  Version 3.1b1 (May 20, 2008)  1989-2008
> error(100): soslLexerRules.g:0:0: syntax error: buildnfa: <AST>:0:0:
> unexpected AST node: synpred133_soslLexerRules
> error(100): soslLexerRules.g:0:0: syntax error: buildnfa:
> <AST>:184:10: expecting EOA, found '..'
> error(100): soslLexerRules.g:0:0: syntax error: buildnfa: <AST>:
> expecting EOA, found '<empty tree>'
> error(10):  internal error: soslLexerRules.g :  
> java.lang.NullPointerException
> org.antlr.tool.NFAFactory.build_Astar(NFAFactory.java:570)
> org.antlr.tool.TreeToNFAConverter.ebnf(TreeToNFAConverter.java:1937)
> org.antlr.tool.TreeToNFAConverter.element(TreeToNFAConverter.java: 
> 1261)
> org 
> .antlr.tool.TreeToNFAConverter.alternative(TreeToNFAConverter.java: 
> 1008)
> org.antlr.tool.TreeToNFAConverter.block(TreeToNFAConverter.java:803)
> org.antlr.tool.TreeToNFAConverter.ebnf(TreeToNFAConverter.java:1989)
> org.antlr.tool.TreeToNFAConverter.element(TreeToNFAConverter.java: 
> 1261)
> org 
> .antlr.tool.TreeToNFAConverter.alternative(TreeToNFAConverter.java: 
> 1008)
> org.antlr.tool.TreeToNFAConverter.block(TreeToNFAConverter.java:803)
> org.antlr.tool.TreeToNFAConverter.rule(TreeToNFAConverter.java:586)
> org.antlr.tool.TreeToNFAConverter.rules(TreeToNFAConverter.java:412)
> org 
> .antlr.tool.TreeToNFAConverter.grammarSpec(TreeToNFAConverter.java: 
> 366)
> org.antlr.tool.TreeToNFAConverter.grammar(TreeToNFAConverter.java:159)
> org.antlr.tool.Grammar.buildNFA(Grammar.java:858)
> org.antlr.tool.CompositeGrammar.createNFAs(CompositeGrammar.java:362)
> org.antlr.Tool.process(Tool.java:284)
> org.antlr.Tool.main(Tool.java:71)
> ================================================================
>
> ================================================================
> lexer grammar soslLexerRules;
>
>
> options {
> 	backtrack=true;
> 	memoize=true;
> 	filter=true;
> 	// k=2;
> 	// charVocabulary='\u0000'..'\uFFFE';  // support full unicode
> }
>
> @header {
> import java.util.HashMap;
> }
>
>
> @members {
>    private boolean _scanningQuery = false;
>
>    public boolean isScanningQuery() {
>        return _scanningQuery;
>    }
>
>    public void setScanningQuery(boolean scanningQuery) {
>        _scanningQuery = scanningQuery;
>    }
>
> }
>
>
>
>
> EQUAL 			: '=' ;
> NOT_EQUAL 		: '!=' ;
> LESS_THAN 		: '<' ;
> LESS_THAN_OR_EQUAL 	: '<=' ;
> GREATER_THAN 		: '>' ;
> GREATER_THAN_OR_EQUAL 	: '>=' ;
> LPAREN 			: '(' ;
> RPAREN 			: ')' ;
> COLON   		: ':' ;
> COMMA 			: ',' ;
>
>
> LITERAL : { isScanningQuery() }? '"'
>    (SEARCH_CHAR
>        | ' '
>        | '\t'
>        | '\n'
>        | '\r')*
>     '"'
>   ;
>
> SEARCH_TERM : { isScanningQuery() }? SEARCH_CHAR2 ( SEARCH_CHAR )*
>    ;
>
> LCURLY  : '{' { setScanningQuery(true); }
>    ;
>
> RCURLY  : '}' { setScanningQuery(false); }
>    ;
>
> // ----------------------------------------------------
> // Following are parser tokens
> // ----------------------------------------------------
> FIND 		: 	{ !isScanningQuery() }? ('f'|'F') ('i'|'I') ('n'|'N')  
> ('d'|'D') ;
> LIMIT 		 : 	{ !isScanningQuery() }? ('l'|'L') ('i'|'I') ('m'|'M')
> ('i'|'I') ('t'|'T') ;
> IN 		 : 	{ !isScanningQuery() }? ('i'|'I') ('n'|'N') ;
> CONVERTCURRENCY	 :	{ !isScanningQuery() }? 'convertCurrency' ;
> AMOUNT 		 : 	{ !isScanningQuery() }? 'Amount' ;
> TOLABEL 	 : 	{ !isScanningQuery() }? 'toLabel' ;
> ALL		 :	{ !isScanningQuery() }? 'ALL' ;
> FIELDS		 :	{ !isScanningQuery() }? 'FIELDS' ;
> NAME		 :	{ !isScanningQuery() }? 'NAME' ;
> EMAIL		 :	{ !isScanningQuery() }? 'EMAIL' ;
> PHONE		 :	{ !isScanningQuery() }? 'PHONE' ;
> RETURNING	 : 	{ !isScanningQuery() }? ('r'|'R') ('e'|'E') ('t'|'T')
> ('u'|'U') ('r'|'R') ('n'|'N') ('i'|'I') ('n'|'N') ('g'|'G') ;
> ORDER		 :	{ !isScanningQuery() }? ('o'|'O') ('r'|'R') ('d'|'D')
> ('e'|'E') ('r'|'R') ;
> BY		 :	{ !isScanningQuery() }? ('b'|'B') ('y'|'Y') ;
> ASC		 :	{ !isScanningQuery() }? 'ASC' ;
> DESC		 :	{ !isScanningQuery() }? 'DESC' ;
> NULLS		 :	{ !isScanningQuery() }? 'NULLS' ;
> FIRST		 :	{ !isScanningQuery() }? ('f'|'F') ('i'|'I') ('r'|'R')
> ('s'|'S') ('t'|'T') ;
> LAST		 :	{ !isScanningQuery() }? ('l'|'L') ('a'|'A') ('s'|'S')  
> ('t'|'T') ;
> WITH		 :	{ !isScanningQuery() }? ('w'|'W') ('i'|'I') ('t'|'T')  
> ('h'|'H') ;
> DIVISION	 :	{ !isScanningQuery() }? ('d'|'D') ('i'|'I') ('v'|'V')
> ('i'|'I') ('s'|'S') ('i'|'I') ('o'|'O') ('n'|'N') ;
> AND_SCAN	 :	{ isScanningQuery() }?  ('a'|'A') ('n'|'N') ('d'|'D') ;
> OR_SCAN 	 :	{ isScanningQuery() }?  ('o'|'O') ('r'|'R') ;
> NOT_SCAN	 :	{ isScanningQuery() }?  ('n'|'N') ('o'|'O') ('t'|'T') ;
> AND		 :	{ !isScanningQuery() }? ('a'|'A') ('n'|'N') ('d'|'D') ;
> OR 		 :	{ !isScanningQuery() }? ('o'|'O') ('r'|'R') ;
> NOT		 :	{ !isScanningQuery() }? ('n'|'N') ('o'|'O') ('t'|'T') ;
> WHERE		 :	{ !isScanningQuery() }? ('w'|'W') ('h'|'H') ('e'|'E')
> ('r'|'R') ('e'|'E') ;
> LIKE		 :	{ !isScanningQuery() }? ('l'|'L') ('i'|'I') ('k'|'K')  
> ('e'|'E') ;
> NULL		 :	{ !isScanningQuery() }? ('n'|'N') ('u'|'U') ('l'|'L')  
> ('l'|'L') ;
> TRUE		 :	{ !isScanningQuery() }? ('t'|'T') ('r'|'R') ('u'|'U')  
> ('e'|'E') ;
> FALSE		 :	{ !isScanningQuery() }? ('f'|'F') ('a'|'A') ('l'|'L')
> ('s'|'S') ('e'|'E') ;
> INCLUDES	 :	{ !isScanningQuery() }? ('i'|'I') ('n'|'N') ('c'|'C')
> ('l'|'L') ('u'|'U') ('d'|'D') ('e'|'E') ('s'|'S') ;
> EXCLUDES	 :	{ !isScanningQuery() }? ('e'|'E') ('x'|'X') ('c'|'C')
> ('l'|'L') ('u'|'U') ('d'|'D') ('e'|'E') ('s'|'S') ;
> YESTERDAY	 :	{ !isScanningQuery() }? 'YESTERDAY' ;
> TODAY 		 :	{ !isScanningQuery() }? 'TODAY' ;
> TOMORROW 	 :	{ !isScanningQuery() }? 'TOMORROW' ;
> LAST_WEEK 	 :	{ !isScanningQuery() }? 'LAST_WEEK' ;
> THIS_WEEK 	 :	{ !isScanningQuery() }? 'THIS_WEEK' ;
> NEXT_WEEK 	 :	{ !isScanningQuery() }? 'NEXT_WEEK' ;
> LAST_MONTH 	 :	{ !isScanningQuery() }? 'LAST_MONTH' ;
> THIS_MONTH 	 :	{ !isScanningQuery() }? 'THIS_MONTH' ;
> NEXT_MONTH 	 :	{ !isScanningQuery() }? 'NEXT_MONTH' ;
> LAST_90_DAYS 	 :	{ !isScanningQuery() }? 'LAST_90_DAYS' ;
> NEXT_90_DAYS 	 :	{ !isScanningQuery() }? 'NEXT_90_DAYS' ;
> LAST_N_DAYS 	 :	{ !isScanningQuery() }? 'LAST_N_DAYS' ;
> NEXT_N_DAYS 	 :	{ !isScanningQuery() }? 'NEXT_N_DAYS' ;
> THIS_QUARTER 	 :	{ !isScanningQuery() }? 'THIS_QUARTER' ;
> LAST_QUARTER 	 :	{ !isScanningQuery() }? 'LAST_QUARTER' ;
> NEXT_QUARTER 	 :	{ !isScanningQuery() }? 'NEXT_QUARTER' ;
> THIS_YEAR 	 :	{ !isScanningQuery() }? 'THIS_YEAR' ;
> LAST_YEAR 	 :	{ !isScanningQuery() }? 'LAST_YEAR' ;
> NEXT_YEAR 	 :	{ !isScanningQuery() }? 'NEXT_YEAR' ;
> NEXT_N_YEARS 	 :	{ !isScanningQuery() }? 'NEXT_N_YEARS' ;
> LAST_N_YEARS 	 :	{ !isScanningQuery() }? 'LAST_N_YEARS' ;
> THIS_FISCAL_QUARTER 	 :	{ !isScanningQuery() }?  
> 'THIS_FISCAL_QUARTER' ;
> LAST_FISCAL_QUARTER 	 :	{ !isScanningQuery() }?  
> 'LAST_FISCAL_QUARTER' ;
> NEXT_FISCAL_QUARTER 	 :	{ !isScanningQuery() }?  
> 'NEXT_FISCAL_QUARTER' ;
> NEXT_N_QUARTERS 	 :	{ !isScanningQuery() }? 'NEXT_N_QUARTERS' ;
> LAST_N_QUARTERS 	 :	{ !isScanningQuery() }? 'LAST_N_QUARTERS' ;
> THIS_FISCAL_YEAR 	 :	{ !isScanningQuery() }? 'THIS_FISCAL_YEAR' ;
> LAST_FISCAL_YEAR 	 :	{ !isScanningQuery() }? 'LAST_FISCAL_YEAR' ;
> NEXT_FISCAL_YEAR 	 :	{ !isScanningQuery() }? 'NEXT_FISCAL_YEAR' ;
> NEXT_N_FISCAL_YEARS 	 :	{ !isScanningQuery() }?  
> 'NEXT_N_FISCAL_YEARS' ;
> LAST_N_FISCAL_YEARS 	 :	{ !isScanningQuery() }?  
> 'LAST_N_FISCAL_YEARS' ;
> NEXT_N_FISCAL_QUARTERS	 :	{ !isScanningQuery() }?  
> 'NEXT_N_FISCAL_QUARTERS' ;
> LAST_N_FISCAL_QUARTERS 	 :	{ !isScanningQuery() }?  
> 'LAST_N_FISCAL_QUARTERS' ;
> // ----------------------------------------------------
> // ----------------------------------------------------
>
> WS	 :	(' '
> 	|	'\t'
> 	|	'\n'
> 	|	'\r')
> 		{ skip();   }
> 	;
> 	
>
>
> ID     : { !isScanningQuery() }? ( LETTER (LETTER | '_' | DIGIT)*);
>
> PARAM  : { isScanningQuery() }? '$' LETTER (LETTER | '_' | DIGIT)*;
>
> NUMBER  : { !isScanningQuery() }? DIGIT+ ;
>
>
> QUOTE_DATA  : '\'' ( SEARCH_CHAR )+ '\'' ;
>
>
> fragment
> DATETIME : DATE ('t'|'T') HOUR ':' MINUTE ':' SECOND (('z'|'Z') |
> (('+' |'-') HOUR ':' MINUTE))
>    ;
>
> fragment
> DATE : ( DIGIT DIGIT DIGIT DIGIT ) '-' ( '0' '1'..'9' | '1' ('0' | '1'
> | '2') ) '-'  ( '0' '1'..'9' | '1'..'2' DIGIT | '3' ('0' | '1') )
>    ;
>
> fragment
> HOUR : '0'..'1' DIGIT | '2' '0'..'3'
>    ;
>
> fragment
> MINUTE : '0'..'5' DIGIT
>    ;
>
> fragment
> SECOND : '0'..'5' DIGIT | '60'
>    ;
>
>
> POSINTEGER  : DIGIT+
>    ;
>
> fragment
> DIGIT : '0'..'9'
>    ;
>
> fragment
> LETTER : 'a'..'z' | 'A'..'Z'
>    ;
> 	
> // same as SEARCH_CHAR, but won't match a $
> fragment
> SEARCH_CHAR2 :
>    ( '\\&'
>    | '\\|'
>    | '\\!'
>    | '\\{'
>    | '\\}'
>    | '\\['
>    | '\\]'
>    | '\\('
>    | '\\)'
>    | '\\^'
>    | '\\~'
>    | '\\:'
>    | '\\\\'
>    | '\\\''
>    | '\\\"' //  asd
>    | '\\+'
>    | '\\-'
>    | '\\?'
>    | '\\*'
>    |
>   ~( ' '              // don't allow white space
>    | '\t'             // don't allow white space
>    | '\n'             // don't allow white space
>    | '\r'             // don't allow white space
>    | '&'              // reserved char per spec
>    | '|'              // reserved char per spec
>    | '!'              // reserved char per spec
>    | '{'              // reserved char per spec
>    | '}'              // reserved char per spec
>    | '['              // reserved char per spec
>    | ']'              // reserved char per spec
>    | '('              // reserved char per spec (from 10.0)
>    | ')'              // reserved char per spec (from 10.0)
>    | '?'              // reserved char per spec (from 10.0)
>    | '^'              // reserved char per spec
>    | '~'              // reserved char per spec
>    | ':'              // reserved char per spec
>    | '\\'             // reserved char per spec
>    | '\''             // reserved char per spec
>    | '\"'             // not reserved, but treating as reserved for
> better parsing behavior.
>    | '+'              // reserved char per spec
>    | '-'              // reserved char per spec
>    | '$'              // reserved for params
>    ) )
>    ;
>
> // FIND_VAL : 'f' 'i' 'n' 'd'
> //    ;
>
>
> fragment
> SEARCH_CHAR :
>    ( '\\&'
>    | '\\|'
>    | '\\!'
>    | '\\{'
>    | '\\}'
>    | '\\['
>    | '\\]'
>    | '\\('
>    | '\\)'
>    | '\\^'
>    | '\\~'
>    | '\\:'
>    | '\\\\'
>    | '\\\''
>    | '\\\"'
>    | '\\+'
>    | '\\-'
>    | '\\?'
> // --    | '\\*'
>    |
>   ~( ' '              // don't allow white space
>    | '\t'             // don't allow white space
>    | '\n'             // don't allow white space
>    | '\r'             // don't allow white space
>    | '&'              // reserved char per spec
>    | '|'              // reserved char per spec
>    | '!'              // reserved char per spec
>    | '{'              // reserved char per spec
>    | '}'              // reserved char per spec
>    | '['              // reserved char per spec
>    | ']'              // reserved char per spec
>    | '('              // reserved char per spec (from 10.0)
>    | ')'              // reserved char per spec (from 10.0)
>    | '?'              // reserved char per spec (from 10.0)
>    | '^'              // reserved char per spec
>    | '~'              // reserved char per spec
>    | ':'              // reserved char per spec
>    | '\\'             // reserved char per spec
>    | '\''             // reserved char per spec
>    | '\"'             // not reserved, but treating as reserved for
> better parsing behavior.
>    | '+'              // reserved char per spec
>    | '-'              // reserved char per spec
>    ) )
>    ;
> ================================================================
> <soslLexerRules.g>



More information about the antlr-interest mailing list