[antlr-interest] Cannot display rule "X" because start state is not found
Michael Pinnegar
jazzepi at gmail.com
Sun Nov 1 20:34:52 PST 2009
Working on a game project that involves a scripting language that I want to interpret into a virtual
machine code that can be executed directly. I've included the grammar below. All the lexer rules are
displaying properly in the syntax diagram, but when I click on the bodies of any of the parser
rules, I get "Cannot display rule "X" because start state is not found" for a given parser rule X.
I'm not really sure why ANTLR is complaining about not having a start state. The grammar should
plainly start from codeline, which isn't referenced by any other parser rule. Also, the box in the
upper right is green, indicating there are no syntax errors.
I combed through some of the other message board posts, as well as many of the grammars provided in
the ANTLRv3 sample grammar download, but none of them have any special code that indicates to ANTLR
which one of the parser rules is the start state. I feel like something simple is broken, but I'm at
an impasse as to what exactly that is.
Any advice or assistance would be much appreciated! Even if it's just along the lines of "go read this".
Thanks,
MPinnegar
****GRAMMAR BELOW THIS LINE****
grammar RobotWarsGrammar;
//Parser rules
codeline
: comment
| routine
;
comment
: !(DIGIT | LETTER | SPACE)*
;
routine
: subroutine
| main_program
;
subroutine
: 'SUBROUTINE' IDENTIFIER LPAREN parameters RPAREN LCURL block* RCURL return_statement
;
parameters
: variable_name (',' variable_name)*
|
;
return_statement
: 'RETURN' variable_name
;
main_program
: 'MAIN' LCURL block* RCURL
;
block
: statement*
;
statement
: if
| while
| call
| variable_assignment
| game_order
;
if
: if_only
| if_else
;
if_only
: 'IF' LPAREN expression CONDITION expression RPAREN LCURL block RCURL
;
if_else
: 'IF-ELSE' LPAREN expression CONDITION expression RPAREN LCURL block 'ELSE' block RCURL
;
while
: 'WHILE' LPAREN expression CONDITION expression RPAREN LCURL block RCURL
;
call
: variable_name EQUAL IDENTIFIER LPAREN parameters RPAREN SEMICOLON
| IDENTIFIER LPAREN parameters RPAREN SEMICOLON
;
variable_assignment
: 'VAR' variable_name EQUAL DIGIT+ SEMICOLON
| 'VAR' variable_name EQUAL game_function SEMICOLON
| 'VAR' variable_name EQUAL expression SEMICOLON
;
variable_name
: IDENTIFIER
;
expression
: term (ADDOP term)*
;
term
: factor (MULTOP factor)*
;
factor
: LPAREN expression RPAREN
| DIGIT+
| variable_name
;
game_function
: 'IS_ENEMY_IN_RANGE' LPAREN parameters RPAREN
;
game_order
: 'FIRE_WEAPON' LPAREN parameters RPAREN
;
// Lexer rules
IDENTIFIER
: LETTER (LETTER|DIGIT)*
;
LETTER
: ('a'..'z'|'A'..'Z')
| '_'
| '-'
;
DIGIT
:'0'..'9'
;
ADDOP
: '+'
| '-'
;
MULTOP
: TIMES
| DIVIDE
| MOD
;
CONDITION
: '!='
| '=='
| '<'
| '>'
| '<='
| '>='
;
SPACE
options {
paraphrase = " ";
}
: ' '
;
SEMICOLON
options {
paraphrase = ";";
}
: ';'
;
LPAREN
options {
paraphrase = "(";
}
: '('
;
RPAREN
options {
paraphrase = ")";
}
: ')'
;
LCURL
options {
paraphrase = "{";
}
: '{'
;
RCURL
options {
paraphrase = "}";
}
: '}'
;
PLUS
options {
paraphrase = "+";
}
: '+'
;
MINUS
options {
paraphrase = "-";
}
: '-'
;
TIMES
options {
paraphrase = "*";
}
: '*'
;
DIVIDE
options {
paraphrase = "/";
}
: '/'
;
MOD
options {
paraphrase = "%";
}
: '%'
;
EQUAL
options {
paraphrase = "=";
}
: '='
;
More information about the antlr-interest
mailing list