Antlr: Difference between revisions
Jump to navigation
Jump to search
| Line 10: | Line 10: | ||
= Base Class Language Parser = | = Base Class Language Parser = | ||
The abstract base class LanguageParser has some help code that makes language development and debugging easier. | The abstract base class LanguageParser has some help code that makes language development and debugging easier. | ||
=== Example === | |||
<source lang='java'> | |||
/** | |||
* example parser | |||
* @author wf | |||
* | |||
*/ | |||
public class ExpLanguageParser extends LanguageParser { | |||
private ExpParser parser; | |||
ExpLexer lexer; | |||
public ExpParser getParser() { | |||
return parser; | |||
} | |||
@Override | |||
protected ParseTree getRootContext(Parser parser) { | |||
if (!(parser instanceof ExpParser)) { | |||
throw new RuntimeException("wrong parser type for getRootContext, expected Rule but got "+parser.getClass().getName()); | |||
} else { | |||
ExpParser expParser=(ExpParser) parser; | |||
return expParser.eval(); | |||
} | |||
} | |||
@Override | |||
protected ParseTree parse(ANTLRInputStream in, String inputText) | |||
throws Exception { | |||
lexer = new ExpLexer(in); | |||
parser=new ExpParser(getTokens(lexer)); | |||
ParseTree result=super.parse(lexer,getParser()); | |||
return result; | |||
} | |||
@Override | |||
public void showParseTree() { | |||
super.showParseTree(getParser()); | |||
} | |||
} | |||
</source> | |||
= Motivation = | = Motivation = | ||
Revision as of 12:32, 14 October 2017
ANTLR is a parser generator tool.
BITPlan has been using ANTLR in projects for a few years now and Wolfgang Fahl has been active in improving ANTLR see e.g. #Motivation
Library with helpers for ANTLR Language development com.bitplan.antlr
To simplify Parser development with ANTLR BITPlan has created a library with some helper code for ANTLR Language Development and published it as Open Source at:
Base Class Language Parser
The abstract base class LanguageParser has some help code that makes language development and debugging easier.
Example
/**
* example parser
* @author wf
*
*/
public class ExpLanguageParser extends LanguageParser {
private ExpParser parser;
ExpLexer lexer;
public ExpParser getParser() {
return parser;
}
@Override
protected ParseTree getRootContext(Parser parser) {
if (!(parser instanceof ExpParser)) {
throw new RuntimeException("wrong parser type for getRootContext, expected Rule but got "+parser.getClass().getName());
} else {
ExpParser expParser=(ExpParser) parser;
return expParser.eval();
}
}
@Override
protected ParseTree parse(ANTLRInputStream in, String inputText)
throws Exception {
lexer = new ExpLexer(in);
parser=new ExpParser(getTokens(lexer));
ParseTree result=super.parse(lexer,getParser());
return result;
}
@Override
public void showParseTree() {
super.showParseTree(getParser());
}
}