[antlr-interest] Fwd: Grammar Problem

Thomas Jackson thomas.jackson.iii at gmail.com
Fri Oct 12 07:32:25 PDT 2007


Sorry if this is a duplicated message, my first one seemed not to go
through...


[09:45:02] java.lang.NullPointerException
    at org.antlr.tool.ActionAnalysisLexer.mX_Y(ActionAnalysisLexer.java:139)
    at org.antlr.tool.ActionAnalysisLexer.mTokens(ActionAnalysisLexer.java
:323)
    at org.antlr.tool.ActionAnalysisLexer.nextToken (
ActionAnalysisLexer.java:69)
    at org.antlr.tool.ActionAnalysisLexer.analyze(ActionAnalysisLexer.java
:43)
    at org.antlr.tool.Grammar.examineAllExecutableActions(Grammar.java:1283)
    at org.antlr.tool.Grammar.setGrammarContent (Grammar.java:567)
    at org.antlr.tool.Grammar.setGrammarContent(Grammar.java:497)
    at org.antlr.works.grammar.EngineGrammar.createNewGrammar(Unknown
Source)
    at org.antlr.works.grammar.EngineGrammar.createParserGrammar (Unknown
Source)
    at org.antlr.works.grammar.EngineGrammar.createGrammars(Unknown Source)
    at org.antlr.works.grammar.EngineGrammar.analyze(Unknown Source)
    at org.antlr.works.grammar.CheckGrammar.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:595)

In generating a tree grammar in ANTLRWorks I get a messagebox that pops up
with the following error.

Does anyone know of what things could cause this?  Grammar is below....

Thanks
Thomas


tree grammar TSLtw;

options {
tokenVocab=TSL;
ASTLabelType=CommonTree;
output=template;
}

@header {
package com.microfocus.kenly.tsl;

import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.IOException;

import java.util.List;

}

@members {
  private File _fOutDir;

  public void setOutputDirectory(File fOutDir) throws
IllegalArgumentException
  {
      _fOutDir = fOutDir;
      if(!_fOutDir.exists())
          _fOutDir.mkdirs();
      if(!_fOutDir.isDirectory())
          throw new IllegalArgumentException();
  }
}
generate
    : type+
    ;

type
scope{
File dirPackage;
String baseType;
List<String> imports
}
@init
{
$type::dirPackage = null;
$type::baseType = null;
$type::imports = new ArrayList<String>();
}
    :  ^(TYPE ^(ID pr=packageRule) parent description (p+=property)*)
        {
            try
            {
                StringTemplate fileNameTemplate =
%filename(basename={$ID.text});
                StringTemplate packageNameTemplate =
%filename(basename={$ID.text});
                File fDir = $type::dirPackage != null ? $type::dirPackage :
_fOutDir;
                if(!fDir.exists())
                   fDir.mkdirs();
                File f = new File(fDir, fileNameTemplate.toString());
                PrintWriter wtr = new PrintWriter(new FileWriter(f));
                StringTemplate typeTemplate = %type(name={$ID.text},
basetype={$parent.st}, desc={$description.st}, props={$p});
                StringTemplate fileTemplate = %file();
                fileTemplate.setAttribute("class", typeTemplate.toString());
                fileTemplate.setAttribute("packagename", pr.toString());
                fileTemplate.setAttribute("imports", $type::imports);
                wtr.println(fileTemplate.toString());
                wtr.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    ;

packageRule
    : ^(PACKAGE ids+=ID+)
      {
          StringTemplate packageDir = %dirname(vals={$ids});
          String absolutePath =
_fOutDir.getAbsolutePath()+"/"+packageDir.toString();
          $type::dirPackage = new File(absolutePath);
      }
    -> packagename(vals={$ids})
    ;

parent
    :  ^(PARENT ID) -> extend(name={$ID.text})
    |  PARENT     -> { %{"\\none"} }
    ;


property
scope{ String propertyName }
    : ^(PROP n=ID {$property::propertyName=$n.text; } t=propertytype) ->
property(prop={$t.st})
    ;

classtype
    : ^(n=ID ^(PACKAGE p+=ID+ ))
    {
          StringTemplate importSt = %import(package={$p}, classname={$n});
          $type::imports.add(importSt.toString());
    } -> {%{$n.text}}
    ;
propertytype
    : ^(CLASS classtype) -> class(name={$property::propertyName},
type={$classtype.st})
    | ^(LIST classtype) -> list(name={$property::propertyName},
type={$classtype.st})
    | ^(ENUM vals+=ID+) -> enum(name={$property::propertyName},
vals={$vals})
    ;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20071012/cf62e440/attachment.html 


More information about the antlr-interest mailing list