From b09cdca0a7d78cc6c7fec4f7bbb1ed754328db64 Mon Sep 17 00:00:00 2001 From: Anders Nilsson <anders.nilsson@cs.lth.se> Date: Tue, 7 Nov 2006 22:06:47 +0100 Subject: [PATCH] Written first part of JavaCC grammar generation --- CompilerGeneration.jrag | 76 +++++++++++++++--- JavaCCChunks.jrag | 170 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 233 insertions(+), 13 deletions(-) create mode 100644 JavaCCChunks.jrag diff --git a/CompilerGeneration.jrag b/CompilerGeneration.jrag index 8cc0055..138ff1e 100644 --- a/CompilerGeneration.jrag +++ b/CompilerGeneration.jrag @@ -10,6 +10,8 @@ aspect AbsGrammarGeneration { } public void Start.genAbsGrammar(PrintStream pStream) { + pStream.println("Start ::= Device*"); + pStream.println("abstract Thing ::=;"); super.genAbsGrammar(pStream); } @@ -79,19 +81,67 @@ aspect JavaCCGen { } public void Start.genJavaCC(PrintStream pStream) { - pStream.println("options {"); - pStream.println(" MULTI = true;"); - pStream.println(" VISITOR = true;"); - pStream.println(" NODE_DEFAULT_VOID = true;"); - pStream.println(" NODE_SCOPE_HOOK = false;"); - pStream.println(" NODE_PREFIX = \"\";"); - pStream.println(" JAVA_UNICODE_ESCAPE = true;"); - pStream.println(" STATIC = false;"); - pStream.println("} "); - pStream.println("PARSER_BEGIN(OwlParser)"); - pStream.println("package AST;"); - pStream.println("public class OwlParser {"); + genJavaCCHeader(pStream); + pStream.println(); + genTokenDefs(pStream); + pStream.println(); + genJavaCCLiterals(pStream); + pStream.println(); + genJavaCCIdentifiers(pStream); + pStream.println(); + genJavaCCSeparators(pStream); + pStream.println(); + genJavaCCOperators(pStream); + pStream.println(); + + // OK, so now it's time to start generating some real grammar + // productions. + genJavaCCGrammar(pStream); + } + + void ASTNode.genTokenDefs(PrintStream pStream) { + for (int i=0; i<getNumChild(); i++) { + getChild(i).genTokenDefs(pStream); + } + } + + void Start.genTokenDefs(PrintStream pStream) { + pStream.println("<DEFAULT, BOUNDS> TOKEN : /* RESERVED WORDS */"); + pStream.println("{"); + pStream.println(" <XML \t : \"xml\" >"); + super.genTokenDefs(pStream); + pStream.println("}"); + pStream.println(); + } + + void OwlClassDecl.genTokenDefs(PrintStream pStream) { + pStream.println(" |<"+getId().toUpperCase()+" \t : \""+getId()+"\">"); + } + + void ASTNode.genJavaCCGrammar(PrintStream pStream) { + for (int i=0; i<getNumChild(); i++) { + getChild(i).genJavaCCGrammar(pStream); + } + } + + void Start.genJavaCCGrammar(PrintStream pStream) { + pStream.println("Start Start() #Start : {}"); + pStream.println("{"); + pStream.println(" (Device())*"); + pStream.println(" { return jjtThis; }"); + pStream.println("}"); + pStream.println(); + super.genJavaCCGrammar(pStream); + } + + void OwlClassDecl.genJavaCCGrammar(PrintStream pStream) { + pStream.println("void "+getId()+" : {}"); + pStream.println("{"); + if (getId().equals("Device")) { + pStream.print("\"<\" <DEVICE> \">\""); + pStream.print("Property()* Skill()* MainFunction() #"); + pStream.println("Device(3)"); + } pStream.println("}"); - pStream.println("PARSER_END(OwlParser)"); } } diff --git a/JavaCCChunks.jrag b/JavaCCChunks.jrag new file mode 100644 index 0000000..61786fc --- /dev/null +++ b/JavaCCChunks.jrag @@ -0,0 +1,170 @@ +/* -*-Java-*- */ + +aspect JavaCCChunks { + void Start.genJavaCCHeader(PrintStream pStream) { + pStream.println("options {"); + pStream.println(" MULTI = true;"); + pStream.println(" VISITOR = true;"); + pStream.println(" NODE_DEFAULT_VOID = true;"); + pStream.println(" NODE_SCOPE_HOOK = false;"); + pStream.println(" NODE_PREFIX = \"\";"); + pStream.println(" JAVA_UNICODE_ESCAPE = true;"); + pStream.println(" STATIC = false;"); + pStream.println("} "); + pStream.println(); + pStream.println("PARSER_BEGIN(SiarasParser)"); + pStream.println(" package siaras;"); + pStream.println(" public class SiarasParser {"); + pStream.println("}"); + pStream.println("PARSER_END(SiarasParser)"); + pStream.println(); + pStream.println("//----------------------------------------------//"); + pStream.println("// LEXICAL TOKENS //"); + pStream.println("//----------------------------------------------//"); + pStream.println("<DEFAULT, BOUNDS> SKIP : /* WHITE SPACE */"); + pStream.println("{"); + pStream.println(" \" \""); + pStream.println(" |"); + pStream.println(" \"\\t\""); + pStream.println(" |"); + pStream.println(" \"\\n\""); + pStream.println(" |"); + pStream.println(" \"\\r\""); + pStream.println(" |"); + pStream.println(" \"\\f\""); + pStream.println("}// WHITE SPACE"); + pStream.println(); + pStream.println("SPECIAL_TOKEN : /* COMMENTS */ "); + pStream.println("{"); + pStream.println(" < \"<!--\" ( ~[\"-\"] | ( \"-\" ~[\"-\"] ) )* \"-->\">"); + pStream.println(" | < \"<rdfs:comment\" ( ~[\"<\"] | ( \"<\" ~[\"/\"] ) )* \"</rdfs:comment>\" >"); + pStream.println("}// COMMENTS"); + pStream.println(); + } + + void Start.genJavaCCLiterals(PrintStream pStream) { + pStream.println("<DEFAULT, BOUNDS> TOKEN : /* LITERALS */"); + pStream.println("{"); + pStream.println(" < INTEGER_LITERAL:"); + pStream.println(" <DECIMAL_LITERAL> ([\"l\",\"L\"])?"); + pStream.println(" |"); + pStream.println(" <HEX_LITERAL> ([\"l\",\"L\"])?"); + pStream.println(" |"); + pStream.println(" <OCTAL_LITERAL> ([\"l\",\"L\"])?"); + pStream.println(" >"); + pStream.println(" |"); + pStream.println(" < #DECIMAL_LITERAL: [\"1\"-\"9\"] ([\"0\"-\"9\"])* >"); + pStream.println(" |"); + pStream.println(" < #HEX_LITERAL: \"0\" [\"x\",\"X\"] ([\"0\"-\"9\",\"a\"-\"f\",\"A\"-\"F\"])+ >"); + pStream.println(" |"); + pStream.println(" < #OCTAL_LITERAL: \"0\" ([\"0\"-\"7\"])* >"); + pStream.println(" |"); + pStream.println(" < FLOAT_LITERAL:"); + pStream.println(" ([\"0\"-\"9\"])+ \".\" ([\"0\"-\"9\"])* (<EXPONENT>)? ([\"f\",\"F\",\"d\",\"D\"])?"); + pStream.println(" |"); + pStream.println(" \".\" ([\"0\"-\"9\"])+ (<EXPONENT>)? ([\"f\",\"F\",\"d\",\"D\"])?"); + pStream.println(" |"); + pStream.println(" ([\"0\"-\"9\"])+ <EXPONENT> ([\"f\",\"F\",\"d\",\"D\"])?"); + pStream.println(" |"); + pStream.println(" ([\"0\"-\"9\"])+ (<EXPONENT>)? [\"f\",\"F\",\"d\",\"D\"]"); + pStream.println(" >"); + pStream.println(" |"); + pStream.println(" < #EXPONENT: [\"e\",\"E\"] ([\"+\",\"-\"])? ([\"0\"-\"9\"])+ >"); + pStream.println(" |"); + pStream.println(" < CHARACTER_LITERAL:"); + pStream.println(" \"\'\""); + pStream.println(" ( (~[\"\'\",\"\\\",\"\n\",\"\r\"])"); + pStream.println(" |"); + pStream.println(" (\"\\\""); + pStream.println(" ( [\"n\",\"t\",\"b\",\"r\",\"f\",\"\\\",\"'\",\"\\\"\"]"); + pStream.println(" |"); + pStream.println(" [\"0\"-\"7\"] ( [\"0\"-\"7\"] )?"); + pStream.println(" |"); + pStream.println(" [\"0\"-\"3\"] [\"0\"-\"7\"] [\"0\"-\"7\"]"); + pStream.println(" )"); + pStream.println(" )"); + pStream.println(" )"); + pStream.println(" \"'\""); + pStream.println(" >"); + pStream.println(" |"); + pStream.println(" < STRING_LITERAL:"); + pStream.println(" \"\\\"\""); + pStream.println(" ( (~[\"\\\"\",\"\\\",\"\n\",\"\r\"])"); + pStream.println(" |"); + pStream.println(" (\"\\\""); + pStream.println(" ( [\"n\",\"t\",\"b\",\"r\",\"f\",\"\\\",\"'\",\"\\\"\"]"); + pStream.println(" |"); + pStream.println(" [\"0\"-\"7\"] ( [\"0\"-\"7\"] )?"); + pStream.println(" |"); + pStream.println(" [\"0\"-\"3\"] [\"0\"-\"7\"] [\"0\"-\"7\"]"); + pStream.println(" )"); + pStream.println(" )"); + pStream.println(" )*"); + pStream.println(" \"\\\"\""); + pStream.println(" >"); + pStream.println("}// LITERALS"); + } + + void Start.genJavaCCIdentifiers(PrintStream pStream) { + pStream.println("<DEFAULT, BOUNDS> TOKEN : /* IDENTIFIERS */"); + pStream.println("{"); + pStream.println(" < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>|\"-\")* >"); + pStream.println(" |"); + pStream.println(" < #LETTER:"); + pStream.println(" ["); + pStream.println(" \"\\u0024\","); + pStream.println(" \"\\u0041\"-\"\\u005a\","); + pStream.println(" \"\\u005f\","); + pStream.println(" \"\\u0061\"-\"\\u007a\","); + pStream.println(" \"\\u00c0\"-\"\\u00d6\","); + pStream.println(" \"\\u00d8\"-\"\\u00f6\","); + pStream.println(" \"\\u00f8\"-\"\\u00ff\","); + pStream.println(" \"\\u0100\"-\"\\u1fff\","); + pStream.println(" \"\\u3040\"-\"\\u318f\","); + pStream.println(" \"\\u3300\"-\"\\u337f\","); + pStream.println(" \"\\u3400\"-\"\\u3d2d\","); + pStream.println(" \"\\u4e00\"-\"\\u9fff\","); + pStream.println(" \"\\uf900\"-\"\\ufaff\""); + pStream.println(" ]"); + pStream.println(" >"); + pStream.println(" |"); + pStream.println(" < #DIGIT:"); + pStream.println(" ["); + pStream.println(" \"\\u0030\"-\"\\u0039\","); + pStream.println(" \"\\u0660\"-\"\\u0669\","); + pStream.println(" \"\\u06f0\"-\"\\u06f9\","); + pStream.println(" \"\\u0966\"-\"\\u096f\","); + pStream.println(" \"\\u09e6\"-\"\\u09ef\","); + pStream.println(" \"\\u0a66\"-\"\\u0a6f\","); + pStream.println(" \"\\u0ae6\"-\"\\u0aef\","); + pStream.println(" \"\\u0b66\"-\"\\u0b6f\","); + pStream.println(" \"\\u0be7\"-\"\\u0bef\","); + pStream.println(" \"\\u0c66\"-\"\\u0c6f\","); + pStream.println(" \"\\u0ce6\"-\"\\u0cef\","); + pStream.println(" \"\\u0d66\"-\"\\u0d6f\","); + pStream.println(" \"\\u0e50\"-\"\\u0e59\","); + pStream.println(" \"\\u0ed0\"-\"\\u0ed9\","); + pStream.println(" \"\\u1040\"-\"\\u1049\""); + pStream.println(" ]"); + pStream.println(" >"); + pStream.println("}// IDENTIFIERS"); + } + + void Start.genJavaCCSeparators(PrintStream pStream) { + pStream.println("<DEFAULT,BOUNDS> TOKEN : /* SEPARATORS */"); + pStream.println("{"); + pStream.println(" < LBRACE : \"{\" >"); + pStream.println(" | < RBRACE : \"}\" >"); + pStream.println(" | < LBRACKET : \"[\" >"); + pStream.println(" | < RBRACKET : \"]\" >"); + pStream.println(" | < SEMICOLON : \";\" >"); + pStream.println("}// SEPARATORS"); + } + + void Start.genJavaCCOperators(PrintStream pStream) { + pStream.println("<DEFAULT,BOUNDS> TOKEN : /* OPERATORS */"); + pStream.println("{"); + pStream.println(" < ASSIGN : \"=\" >"); + pStream.println("}// OPERATORS"); + } +} -- GitLab