Difference between revisions of "Antlr"

From BITPlan Wiki
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 14: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());
  }

}

Motivation

Prerequisites