[antlr-interest] Antlr3b6 [bug?] Can't find template matchSetTrack.st
femto gary
femtowin at gmail.com
Sun Apr 15 05:17:21 PDT 2007
for the following grammar, antlr reports error:
ANTLR Parser Generator Version 3.0b6 (Jan 31, 2007) 1989-2007
warning(200): Rubyv3.g:101:32: Decision can match input such as "SEMI" using mul
tiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
error(10): internal error: Rubyv3.g : java.lang.IllegalArgumentException: Can't
find template matchSetTrack.st
org.antlr.stringtemplate.StringTemplateGroup.lookupTemplate(StringTemplateGroup.
java:485)
org.antlr.stringtemplate.StringTemplateGroup.getInstanceOf(StringTemplateGroup.j
ava:372)
org.antlr.stringtemplate.StringTemplateGroup.getInstanceOf(StringTemplateGroup.j
ava:384)
org.antlr.stringtemplate.StringTemplateGroup.lookupTemplate(StringTemplateGroup.
java:464)
org.antlr.stringtemplate.StringTemplateGroup.getInstanceOf(StringTemplateGroup.j
ava:372)
org.antlr.stringtemplate.StringTemplateGroup.getInstanceOf(StringTemplateGroup.j
ava:384)
org.antlr.stringtemplate.StringTemplateGroup.lookupTemplate(StringTemplateGroup.
java:464)
org.antlr.stringtemplate.StringTemplateGroup.getInstanceOf(StringTemplateGroup.j
ava:372)
org.antlr.stringtemplate.StringTemplateGroup.getInstanceOf(StringTemplateGroup.j
ava:384)
org.antlr.stringtemplate.StringTemplateGroup.lookupTemplate(StringTemplateGroup.
java:464)
org.antlr.stringtemplate.StringTemplateGroup.getInstanceOf(StringTemplateGroup.j
ava:372)
org.antlr.stringtemplate.StringTemplateGroup.getInstanceOf(StringTemplateGroup.j
ava:384)
org.antlr.codegen.CodeGenTreeWalker.getTokenElementST(CodeGenTreeWalker.java:160
)
org.antlr.codegen.CodeGenTreeWalker.set(CodeGenTreeWalker.java:2557)
org.antlr.codegen.CodeGenTreeWalker.atom(CodeGenTreeWalker.java:2243)
org.antlr.codegen.CodeGenTreeWalker.element(CodeGenTreeWalker.java:1370)
org.antlr.codegen.CodeGenTreeWalker.alternative(CodeGenTreeWalker.java:1115)
org.antlr.codegen.CodeGenTreeWalker.block(CodeGenTreeWalker.java:999)
org.antlr.codegen.CodeGenTreeWalker.rule(CodeGenTreeWalker.java:725)
org.antlr.codegen.CodeGenTreeWalker.rules(CodeGenTreeWalker.java:516)
org.antlr.codegen.CodeGenTreeWalker.grammarSpec(CodeGenTreeWalker.java:458)
org.antlr.codegen.CodeGenTreeWalker.grammar(CodeGenTreeWalker.java:305)
org.antlr.codegen.CodeGenerator.genRecognizer(CodeGenerator.java:415)
org.antlr.Tool.processGrammar(Tool.java:329)
org.antlr.Tool.process(Tool.java:266)
org.antlr.Tool.main(Tool.java:69)
doing a google search reveals somebody has also this problem:
http://www.antlr.org/pipermail/antlr-interest/2007-January/019038.html,
is this an antlr3b6 bug?
grammar Rubyv3;
options {
output=AST;
}
tokens {
// 'imaginary' tokens
STATEMENT_LIST;
STATEMENT;
IF;
RPAREN_IN_METHOD_DEFINATION;
BODY;
CALL;
ARG;
//COMPSTMT;
SYMBOL;
BLOCK;
MULTIPLE_ASSIGN;
MULTIPLE_ASSIGN_WITH_EXTRA_COMMA;
BLOCK_ARG;
BLOCK_ARG_WITH_EXTRA_COMMA;
MRHS;
NESTED_LHS;
SINGLETON_METHOD;
STRING;
}
/*@rulecatch {
catch (RecognitionException e) {
throw e;
}
}*/
@header {
package com.xruby.compiler.parser;
}
@lexer::header {
package com.xruby.compiler.parser;
}
@members{
private int can_be_command_ = 0;
protected void enterScope() {assert(false);}
protected void enterBlockScope() {assert(false);}
protected void leaveScope() {assert(false);}
protected void addVariable(Token id) {assert(false);}
protected void setIsInNestedMultipleAssign(boolean v) {assert(false);}
protected void
tellLexerWeHaveFinishedParsingMethodparameters() {assert(false);}
protected void tellLexerWeHaveFinishedParsingSymbol() {assert(false);}
protected void
tellLexerWeHaveFinishedParsingStringExpressionSubstituation() {assert(false);}
protected void
tellLexerWeHaveFinishedParsingRegexExpressionSubstituation() {assert(false);}
protected void
tellLexerWeHaveFinishedParsingHeredocExpressionSubstituation() {assert(false);}
}
@lexer::members
{
//The following methods are to be implemented in the subclass.
//In fact they should be 'abstract', but antlr refuses to generate
//abstract class. We can either insert 'abstract' keyword manually
//after the lexer is generated, or simply use assert() to prevent
//these function to run (so you have to overide them). I choosed
//the later approach.
protected boolean expectOperator(int k) throws
Exception {assert(false);return false;}
protected boolean expectUnary() throws
Exception {assert(false);return false;}
protected boolean expectHash() {assert(false);return false;}
protected boolean expectHeredoc() {assert(false);return false;}
protected boolean expectLeadingColon2() {assert(false);return false;}
protected boolean expectArrayAccess() {assert(false);return false;}
protected boolean lastTokenIsDotOrColon2() {assert(false);return false;}
protected boolean lastTokenIsSemi() {assert(false);return false;}
protected boolean
lastTokenIsKeywordDefOrColonWithNoFollowingSpace() {assert(false);return
false;}
protected boolean
lastTokenIsColonWithNoFollowingSpace() {assert(false);return false;}
protected boolean shouldIgnoreLinebreak() {assert(false);return false;}
protected int trackDelimiterCount(char next_char, char delimeter, int
delimeter_count) {assert(false);return 0;}
protected boolean isDelimiter(String next_line, String
delimiter) {assert(false);return false;}
protected boolean isAsciiValueTerminator(char
value) {assert(false);return false;}
protected boolean justSeenWhitespace() {assert(false);return false;}
protected void setSeenWhitespace() {assert(false);}
protected boolean expressionSubstitutionIsNext() throws
Exception {assert(false);return false;}
protected boolean spaceIsNext() throws Exception {assert(false);return false;}
protected void setCurrentSpecialStringDelimiter(char delimiter, int
delimiter_count) {assert(false);}
protected void updateCurrentSpecialStringDelimiterCount(int
delimiter_count) {assert(false);}
}
program
: statement_list
;
statement_list
: statement* -> ^(STATEMENT_LIST statement*)
;
/*terminal
: SEMI!
| LINE_BREAK!
;*/
statement
: expression (modifier_line)* SEMI? -> ^(STATEMENT expression
(modifier_line)*)
| SEMI!
;
modifier_line
:(IF_MODIFIER|UNLESS_MODIFIER|WHILE_MODIFIER|UNTIL_MODIFIER|RESCUE_MODIFIER)^
expression
;
IF_MODIFIER : 'if';
UNLESS_MODIFIER : 'unless';
WHILE_MODIFIER : 'while';
UNTIL_MODIFIER : 'until';
RESCUE_MODIFIER : 'resuce';
SEMI :';'
;
LINE_BREAK
:'\r'? '\n'{skip();}
;
//OMIT_LINE_BREAK
// : LINE_BREAK* {skip();}
// ;
//emptyable_expression
// : expression|;
expression
: 'expression0' | 'expression1' | 'expression2'|boolean_expression|
block_expression|if_expression|unless_expression;
block_expression
: 'begin' body 'end';
body : statement_list;
boolean_expression
: 'false'|'nil'|'true';
if_expression
: 'if' b=boolean_expression ('then'|':'|LINE_BREAK)
body0=body ('elsif' b1=boolean_expression
('then'|':'|LINE_BREAK) body1+=body)*
('else' body2=body)?
'end' -> ^(IF $b $body0 $b1* $body1* $body2? )
;
unless_expression
: 'unless' boolean_expression ('then'|':'|LINE_BREAK)
body
('else' body)?
'end';
WS : (' ' | '\t') { skip(); }
;
ID : ('a'..'z' | 'A'..'Z') (('a'..'z' | 'A'..'Z') | ('0'..'9'))*
;
More information about the antlr-interest
mailing list