Skip to content

Commit

Permalink
Make the translation of AutoGrammar automatic.
Browse files Browse the repository at this point in the history
  • Loading branch information
stevenrbrandt committed May 25, 2016
1 parent b6b269c commit 9a6ee72
Show file tree
Hide file tree
Showing 3 changed files with 132 additions and 31 deletions.
2 changes: 2 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Piraha is licensed with version 3 of the GNU Lesser General Public License
http://www.gnu.org/licenses/lgpl-3.0.en.html
7 changes: 5 additions & 2 deletions src/edu/lsu/cct/piraha/Group.java
Original file line number Diff line number Diff line change
Expand Up @@ -305,8 +305,11 @@ public static String escChar(char c) {
return "\\\"";
if(c == '\'')
return "\\'";
if(c == '$')
return "\\$";
// Needed for translation to perl data
// structures, but a problem for everything
// else. It shouldn't be here.
// if(c == '$')
// return "\\$";
if(c == '@')
return "\\@";
if(c == '%')
Expand Down
154 changes: 125 additions & 29 deletions src/edu/lsu/cct/piraha/ReParse.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,17 @@ public void init(boolean file) {
}


void dumpGrammar(PrintWriter out) {
void dumpGrammar(PrintWriter out,Lang lang) {
for(String pat : g.getPatternNames()) {
out.print("g.patterns.put(\""+pat+"\",");
if(lang == Lang.java) {
out.print("g.patterns.put(\""+pat+"\",");
} else if(lang == Lang.cxx) {
out.print("g->patterns.put(\""+pat+"\",");
} else if(lang == Lang.perl) {
out.print("$g->{patterns}->{\""+pat+"\"}=(");
}
Pattern p = g.getPattern(pat);
dumpPattern(p,out);
dumpPattern(p,out,lang);
out.println(");");
}
}
Expand Down Expand Up @@ -127,13 +133,27 @@ void out(int c) throws IOException {

}

static String bv(boolean b,Lang lang) {
if(b) {
if(lang == Lang.perl)
return "1";
else
return "true";
} else {
if(lang == Lang.perl)
return "0";
else
return "false";
}
}

/**
* Dump a pattern to a string. Used to generate the AutoGrammar.
* @param p
* @param out
* @throws Error
*/
private void dumpPattern(Pattern p,PrintWriter out) throws Error {
private void dumpPattern(Pattern p,PrintWriter out,Lang lang) throws Error {
if(p instanceof Literal) {
Literal lit = (Literal)p;
out.print("new Literal('"+Group.escChar(lit.ch)+"')");
Expand All @@ -146,22 +166,32 @@ private void dumpPattern(Pattern p,PrintWriter out) throws Error {
out.println("new Seq("+s.ignCase+","+s.igcShow+",");
for(int i=0;i<s.patternList.size();i++) {
if(i>0) out.println(",");
dumpPattern(s.patternList.get(i),out);
dumpPattern(s.patternList.get(i),out,lang);
}
indentLevel -= INDENT_INCR;
if(lang == Lang.cxx) {
out.print(",NULL");
}
out.print(")");
} else if(p instanceof Multi) {
Multi m = (Multi)p;
out.print("new Multi(");
dumpPattern(m.pattern,out);
dumpPattern(m.pattern,out,lang);
out.print(","+m.min+","+m.max+")");
} else if(p instanceof Bracket) {
Bracket b = (Bracket)p;
indentLevel += INDENT_INCR;
out.println("new Bracket("+b.neg+")");
out.println("(new Bracket("+bv(b.neg,lang)+"))");
for(int i=0;i<b.ranges.size();i++) {
Range r = b.ranges.get(i);
out.println(".addRange('"+Group.escChar(r.lo)+"','"+Group.escChar(r.hi)+"')");
if(lang == Lang.cxx) {
out.print("->");
} else if(lang == Lang.java) {
out.print(".");
} else if(lang == Lang.perl) {
out.print("->");
}
out.println("addRange('"+Group.escChar(r.lo)+"','"+Group.escChar(r.hi)+"')");
}
indentLevel -= INDENT_INCR;
} else if(p instanceof Or) {
Expand All @@ -173,13 +203,21 @@ private void dumpPattern(Pattern p,PrintWriter out) throws Error {
out.println("new Or("+or.ignCase+","+or.igcShow+",");
for(int i=0;i<or.patterns.size();i++) {
if(i>0) out.println(',');
dumpPattern(or.patterns.get(i),out);
dumpPattern(or.patterns.get(i),out,lang);
}
indentLevel -= INDENT_INCR;
if(lang == Lang.cxx){
out.print(",NULL");
}
out.print(")");
} else if(p instanceof Lookup) {
Lookup lk = (Lookup)p;
out.print("new Lookup(\""+(lk.capture ? "" : "-")+lk.lookup+"\",g)");
out.print("new Lookup(\""+(lk.capture ? "" : "-")+lk.lookup+"\"");//+"\",g)");
if(lang == Lang.perl) {
out.print(",$g)");
} else {
out.print(",g)");
}
} else if(p instanceof Start) {
out.print("new Start()");
} else if(p instanceof End) {
Expand All @@ -189,7 +227,7 @@ private void dumpPattern(Pattern p,PrintWriter out) throws Error {
} else if(p instanceof NegLookAhead) {
NegLookAhead neg = (NegLookAhead)p;
out.print("new NegLookAhead(");
dumpPattern(neg.pattern, out);
dumpPattern(neg.pattern, out,lang);
out.print(")");
} else if(p instanceof Dot) {
out.print("new Dot()");
Expand Down Expand Up @@ -244,51 +282,109 @@ static void test(ReParse r,String s,String s2) {
}
}

enum Lang { cxx, java, perl, python };

public static void main(String[] args) throws IOException {
ReParse p = createAndTest();
p.generateFile(args[0]);
for(String arg: args) {
if(arg.endsWith(".cc")||arg.endsWith(".cpp"))
p.generateFile(arg, Lang.cxx);
else if(arg.endsWith(".pl")||arg.endsWith(".pm"))
p.generateFile(arg,Lang.perl);
else if(arg.endsWith(".java"))
p.generateFile(arg, Lang.java);
else
throw new Error("Unknown suffix for file "+arg);
}
}

void generateFile(String autoFile) throws IOException {
void generateFile(String autoFile,Lang lang) throws IOException {
init(false);

StringWriter sw = new StringWriter();
indentLevel = 0;
PrintWriter pw = new PrintWriter(new IndentWriter(sw));
pw.println("/** Autogenerated code, created by ReParse. Do not edit. */");
pw.println();
pw.println("package edu.lsu.cct.piraha;");
if(lang == Lang.perl) {
pw.print("# ");
} else {
pw.println("// ");
}
pw.println("Autogenerated code, created by ReParse. Do not edit.");
if(lang == Lang.java) {
pw.println("package edu.lsu.cct.piraha;");
} else if(lang == Lang.cxx) {
pw.println("#include \"Piraha.hpp\"");
} else if(lang == Lang.perl) {
pw.println("use strict;");
pw.println();
pw.println("use piraha;");
}
pw.println();
indentLevel += INDENT_INCR;
pw.println("public class AutoGrammar {");
if(lang == Lang.java) {
indentLevel += INDENT_INCR;
pw.println("public class AutoGrammar {");
}
pw.println();

init(false);
pw.println("public final static Grammar reparser = reparserGenerator();");
if(lang == Lang.java) {
pw.println("public final static Grammar reparser = reparserGenerator();");
} else if(lang == Lang.cxx) {
}
pw.println();
indentLevel += INDENT_INCR;
pw.println("private static Grammar reparserGenerator() {");
pw.println("Grammar g = new Grammar();");
dumpGrammar(pw);
if(lang == Lang.java) {
pw.println("private static Grammar reparserGenerator() {");
pw.println("Grammar g = new Grammar();");
} else if(lang == Lang.cxx) {
pw.println("smart_ptr<Grammar> AutoGrammar::reparserGenerator() {");
pw.println("smart_ptr<Grammar> g = new Grammar();");
} else if(lang == Lang.perl) {
pw.println("sub reparserGenerator() {");
pw.println("my $g = new Grammar();");
}
dumpGrammar(pw,lang);
indentLevel -= INDENT_INCR;
pw.println("return g;");
if(lang == Lang.perl) {
pw.println("return $g;");
} else {
pw.println("return g;");
}
pw.println("}");
pw.println();

init(true);
pw.println("public final static Grammar fileparser = fileparserGenerator();");
if(lang == Lang.java) {
pw.println("public final static Grammar fileparser = fileparserGenerator();");
} else if(lang == Lang.cxx) {
}
pw.println();
indentLevel += INDENT_INCR;
pw.println("private static Grammar fileparserGenerator() {");
pw.println("Grammar g = new Grammar();");
dumpGrammar(pw);
if(lang == Lang.java) {
pw.println("private static Grammar fileparserGenerator() {");
pw.println("Grammar g = new Grammar();");
} else if(lang == Lang.cxx) {
pw.println("smart_ptr<Grammar> AutoGrammar::fileParserGenerator() {");
pw.println("smart_ptr<Grammar> g = new Grammar();");
} else if(lang == Lang.perl) {
pw.println("sub fileparserGenerator() {");
pw.println("my $g = new Grammar();");
}
dumpGrammar(pw,lang);
indentLevel -= INDENT_INCR;
pw.println("return g;");
if(lang == Lang.perl) {
pw.println("return $g;");
} else {
pw.println("return g;");
}
indentLevel -= INDENT_INCR;
pw.println("}");

pw.println("}");
if(lang == Lang.java) {
pw.println("}"); // End class def
} else if(lang == Lang.perl) {
pw.println("1;");
}
pw.close();
String contents = sw.toString();

Expand Down

0 comments on commit 9a6ee72

Please sign in to comment.