add LogManager, add InputSymbolType()

[git-p4: depot-paths = "//depot/code/antlr4/main/": change = 9413]
This commit is contained in:
parrt 2011-11-20 14:27:58 -08:00
parent 18e8a853e7
commit 4b4a7d9c7a
4 changed files with 138 additions and 24 deletions

View File

@ -1,11 +0,0 @@
package org.antlr.v4.runtime;
public class TreeParserRuleContext<T> extends ParserRuleContext<T> {
public TreeParserRuleContext() {
super();
}
public TreeParserRuleContext(RuleContext parent, int stateNumber) {
super(parent, stateNumber);
}
}

View File

@ -0,0 +1,121 @@
/*
[The "BSD license"]
Copyright (c) 2011 Terence Parr
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.antlr.v4.runtime.misc;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class LogManager {
protected static class Record {
long timestamp;
StackTraceElement location;
String component;
String msg;
public Record() {
timestamp = System.currentTimeMillis();
location = new Throwable().getStackTrace()[0];
}
@Override
public String toString() {
StringBuilder buf = new StringBuilder();
buf.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date(timestamp)));
buf.append(" ");
buf.append(component);
buf.append(" ");
buf.append(location.getFileName());
buf.append(":");
buf.append(location.getLineNumber());
buf.append(" ");
buf.append(msg);
return buf.toString();
}
}
protected List<Record> records;
public void log(@Nullable String component, String msg) {
Record r = new Record();
r.component = component;
r.msg = msg;
if ( records==null ) {
records = new ArrayList<Record>();
}
records.add(r);
}
public void log(String msg) { log(null, msg); }
public void save(String filename) throws IOException {
FileWriter fw = new FileWriter(filename);
BufferedWriter bw = new BufferedWriter(fw);
try {
bw.write(toString());
}
finally {
bw.close();
}
}
public void save() throws IOException {
String dir = System.getProperty("java.io.tmpdir");
dir = ".";
String defaultFilename =
dir + "/antlr-" +
new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss").format(new Date()) + ".log";
System.out.println(defaultFilename);
save(defaultFilename);
}
@Override
public String toString() {
if ( records==null ) return "";
String nl = System.getProperty("line.separator");
StringBuilder buf = new StringBuilder();
for (Record r : records) {
buf.append(r);
buf.append(nl);
}
return buf.toString();
}
public static void main(String[] args) throws IOException {
LogManager mgr = new LogManager();
mgr.log("atn", "test msg");
mgr.log("dfa", "test msg 2");
System.out.println(mgr);
mgr.save();
}
}

View File

@ -36,7 +36,7 @@ ListenerFile(file, header) ::= <<
import org.antlr.v4.runtime.tree.*;
import org.antlr.v4.runtime.Token;
public interface <file.grammarName>Listener extends ParseTreeListener\<<TokenLabelType()>\> {
public interface <file.grammarName>Listener extends ParseTreeListener\<<InputSymbolType()>\> {
<file.listenerNames:{lname |
void enterRule(<file.parserName>.<lname>Context ctx);
void exitRule(<file.parserName>.<lname>Context ctx);}; separator="\n">
@ -54,9 +54,9 @@ public class Blank<file.grammarName>Listener implements <file.grammarName>Listen
@Override public void enterRule(<file.parserName>.<lname>Context ctx) { \}
@Override public void exitRule(<file.parserName>.<lname>Context ctx) { \}}; separator="\n">
@Override public void enterEveryRule(ParserRuleContext\<<TokenLabelType()> > ctx) { }
@Override public void exitEveryRule(ParserRuleContext\<<TokenLabelType()> > ctx) { }
@Override public void visitTerminal(<TokenLabelType()> symbol) { }
@Override public void enterEveryRule(ParserRuleContext\<<InputSymbolType()> > ctx) { }
@Override public void exitEveryRule(ParserRuleContext\<<InputSymbolType()> > ctx) { }
@Override public void visitTerminal(<InputSymbolType()> symbol) { }
}
>>
@ -461,10 +461,10 @@ if (!(<chunks>)) throw new FailedPredicateException(this, <if(p.msg)><p.msg><els
>>
ParserASTExtensionMembers(s) ::= <<
public ASTAdaptor\<<ASTLabelType()> > _adaptor = (ASTAdaptor)new CommonASTAdaptor();
public ASTAdaptor\<<ASTLabelType()>\> _adaptor = (ASTAdaptor)new CommonASTAdaptor();
>>
ParserASTContextInterface(s) ::= "ASTContext\<<ASTLabelType()> >"
ParserASTContextInterface(s) ::= "ASTContext\<<ASTLabelType()>>"
ParserASTTreeFieldDecl(s) ::= "<ASTLabelType()> tree"
ParserASTContextMembers(s) ::= <<
@Override public <ASTLabelType()> getTree() { return tree; }
@ -488,6 +488,7 @@ LexerSetAttr(s,rhsChunks) ::= "<s.name> = <rhsChunks>;"
ASTLabelType() ::= "<file.ASTLabelType; null={Object}>"
TokenLabelType() ::= "<file.TokenLabelType; null={Token}>"
InputSymbolType() ::= "<file.InputSymbolType; null={Token}>"
TokenPropertyRef_text(t) ::= "(_localctx.<t.label>!=null?_localctx.<t.label>.getText():null)"
TokenPropertyRef_type(t) ::= "(_localctx.<t.label>!=null?_localctx.<t.label>.getType():0)"
@ -498,9 +499,9 @@ TokenPropertyRef_index(t) ::= "(_localctx.<t.label>!=null?_localctx.<t.label>.ge
TokenPropertyRef_tree(t) ::= "_localctx.<t.label>_tree"
TokenPropertyRef_int(t) ::= "(_localctx.<t.label>!=null?Integer.valueOf(_localctx.<t.label>.getText()):0)"
RulePropertyRef_start(r) ::= "(_localctx.<r.label>!=null?((<TokenLabelType()>)_localctx.<r.label>.start):null)"
RulePropertyRef_stop(r) ::= "(_localctx.<r.label>!=null?((<TokenLabelType()>)_localctx.<r.label>.stop):null)"
RulePropertyRef_tree(r) ::= "(_localctx.<r.label>!=null?((<ASTLabelType()>)_localctx.<r.label>.tree):null)"
RulePropertyRef_start(r) ::= "(_localctx.<r.label>!=null?(_localctx.<r.label>.start):null)"
RulePropertyRef_stop(r) ::= "(_localctx.<r.label>!=null?(_localctx.<r.label>.stop):null)"
RulePropertyRef_tree(r) ::= "(_localctx.<r.label>!=null?(_localctx.<r.label>.tree):null)"
RulePropertyRef_text(r) ::= "(_localctx.<r.label>!=null?_input.toString(_localctx.<r.label>.start,_localctx.<r.label>.stop):null)"
RulePropertyRef_st(r) ::= "(_localctx.<r.label>!=null?_localctx.<r.label>.st:null)"
@ -550,7 +551,7 @@ ListLabelName(label) ::= "<label>_list"
CaptureNextToken(d) ::= "<d.varName> = _input.LT(1);"
CaptureNextTokenType(d) ::= "<d.varName> = _input.LA(1);"
StructDecl(s,attrs,visitorDispatchMethods,interfaces,extensionMembers,superClass={ParserRuleContext\<<TokenLabelType()>>}) ::= <<
StructDecl(s,attrs,visitorDispatchMethods,interfaces,extensionMembers,superClass={ParserRuleContext\<<InputSymbolType()>>}) ::= <<
public static class <s.name> extends <superClass><if(interfaces)> implements <interfaces; separator=", "><endif> {
<attrs:{a | public <a>;}; separator="\n">
<if(s.ctorAttrs)>public <s.name>(RuleContext parent, int state) { super(parent, state); }<endif>
@ -571,7 +572,7 @@ public static class <s.name> extends <superClass><if(interfaces)> implements <in
>>
TreeParserStructDecl(s,attrs,visitorDispatchMethods) ::= <<
<StructDecl(superClass={TreeParserRuleContext\<<ASTLabelType()> >}, ...)>
<StructDecl(superClass={ParserRuleContext\<<ASTLabelType()>\>}, ...)>
>>
AltLabelStructDecl(s,attrs,visitorDispatchMethods) ::= <<
@ -583,14 +584,14 @@ public static class <s.label>Context extends <currentRule.name>Context {
VisitorDispatchMethod(method) ::= <<
@Override
public void <if(method.isEnter)>enter<else>exit<endif>Rule(ParseTreeListener\<<TokenLabelType()>\> listener) {
public void <if(method.isEnter)>enter<else>exit<endif>Rule(ParseTreeListener\<<InputSymbolType()>\> listener) {
if ( listener!=null ) ((<parser.grammarName>Listener)listener).<if(method.isEnter)>enter<else>exit<endif>Rule(this);
}
>>
/*
SwitchedVisitorDispatchMethod(method) ::= <<
public void <if(method.isEnter)>enter<else>exit<endif>Rule(ParseTreeListener\<<TokenLabelType()>\> listener) {
public void <if(method.isEnter)>enter<else>exit<endif>Rule(ParseTreeListener\<<InputSymbolType()>\> listener) {
switch ( altNum ) {
<method.listenerNames:{m |
case <i> : ((<parser.grammarName>Listener)listener).<if(method.isEnter)>enter<else>exit<endif><m>(this); break;}; separator="\n">

View File

@ -36,6 +36,7 @@ public abstract class OutputFile extends OutputModelObject {
public final String fileName;
public final String TokenLabelType;
public final String ASTLabelType;
public final String InputSymbolType;
public OutputFile(OutputModelFactory factory, String fileName) {
super(factory);
@ -43,5 +44,7 @@ public abstract class OutputFile extends OutputModelObject {
Grammar g = factory.getGrammar();
TokenLabelType = g.getOptionString("TokenLabelType");
ASTLabelType = g.getOptionString("ASTLabelType", "CommonAST");
if ( g.isTreeGrammar() ) InputSymbolType = ASTLabelType;
else InputSymbolType = TokenLabelType;
}
}