From: Teiniker E. <tei...@us...> - 2007-02-13 13:56:53
|
Update of /cvsroot/ccmtools/ccmtools/src/ccmtools/parser/assembly In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv11134/src/ccmtools/parser/assembly Added Files: Tag: BRANCH-FHJ bnf.txt assembly.cup assembly.flex Main.java Log Message: merged changes from trunk --- NEW FILE: assembly.cup --- // CUP parser definition for ccmtools assembly descriptions package ccmtools.parser.assembly; import java.util.Vector; import java_cup.runtime.*; parser code {: String current_input_filename = "(filename not set)"; /** * This method overides the original report_error() method * and generates a useful error message. */ public void report_error(String message, Object info) { StringBuilder out = new StringBuilder(); out.append(current_input_filename); if(info instanceof Symbol) { Symbol s = (Symbol)info; if(s.left != -1) { out.append(" line "); out.append(s.left+1); } } out.append(": "); out.append(message); throw new RuntimeException(out.toString()); } public void report_fatal_error(String message, Object info) { System.err.println("FATAL ERROR: "+message); System.exit(1); } :}; terminal ASSEMBLY, ATTRIBUTE; terminal COMPONENT, CONNECT, CONSTANT; terminal IMPLEMENTS, MODULE, THIS, TO; terminal SEMICOLON, DOT, LBRACE, RBRACE, EQUAL; terminal String STRING, NUMBER, QN, NAME; nonterminal ccmtools.parser.assembly.metamodel.Model model; nonterminal ccmtools.parser.assembly.metamodel.ModelElement model_element, module, assembly; nonterminal Vector<ccmtools.parser.assembly.metamodel.ModelElement> model_element_list; nonterminal ccmtools.parser.assembly.metamodel.AssemblyElement assembly_element; nonterminal Vector<ccmtools.parser.assembly.metamodel.AssemblyElement> assembly_element_list; nonterminal ccmtools.parser.assembly.metamodel.QualifiedName qualified_name; nonterminal ccmtools.parser.assembly.metamodel.Port port, internal_port, external_port; nonterminal ccmtools.parser.assembly.metamodel.Value value; start with model; model ::= model:v1 model_element:v2 {: v1.add(v2); RESULT=v1; :} | {: RESULT = new ccmtools.parser.assembly.metamodel.Model(); :} ; model_element ::= module:v1 {: RESULT=v1; :} | assembly:v1 {: RESULT=v1; :} ; model_element_list ::= model_element_list:v1 model_element:v2 {: v1.add(v2); RESULT=v1; :} | {: RESULT = new Vector<ccmtools.parser.assembly.metamodel.ModelElement>(); :} ; module ::= MODULE NAME:v1 LBRACE model_element_list:v2 RBRACE SEMICOLON {: RESULT = new ccmtools.parser.assembly.metamodel.Module(v1, v2); :} ; assembly ::= ASSEMBLY NAME:v1 IMPLEMENTS qualified_name:v2 LBRACE assembly_element_list:v3 RBRACE SEMICOLON {: RESULT = new ccmtools.parser.assembly.metamodel.Assembly(v1, v2, v3); :} ; qualified_name ::= QN:v1 {: RESULT = new ccmtools.parser.assembly.metamodel.QualifiedName(v1); :} | NAME:v1 {: RESULT = new ccmtools.parser.assembly.metamodel.QualifiedName(v1); :} ; assembly_element_list ::= assembly_element_list:v1 assembly_element:v2 {: v1.add(v2); RESULT=v1; :} | {: RESULT = new Vector<ccmtools.parser.assembly.metamodel.AssemblyElement>(); :} ; assembly_element ::= COMPONENT qualified_name:v1 NAME:v2 SEMICOLON {: RESULT = new ccmtools.parser.assembly.metamodel.Component(v1, v2); :} | CONNECT port:v1 TO port:v2 SEMICOLON {: RESULT = new ccmtools.parser.assembly.metamodel.Connection(v1, v2); :} | ATTRIBUTE internal_port:v1 EQUAL external_port:v2 SEMICOLON {: RESULT = new ccmtools.parser.assembly.metamodel.Attribute(v1, v2); :} | CONSTANT internal_port:v1 EQUAL value:v2 SEMICOLON {: RESULT = new ccmtools.parser.assembly.metamodel.Constant(v1, v2); :} ; port ::= internal_port:v1 {: RESULT = v1; :} | external_port:v2 {: RESULT = v2; :} ; internal_port ::= NAME:v1 DOT NAME:v2 {: RESULT = new ccmtools.parser.assembly.metamodel.Port(v1, v2); :} ; external_port ::= NAME:v1 {: RESULT = new ccmtools.parser.assembly.metamodel.Port(v1); :} | THIS DOT NAME:v1 {: RESULT = new ccmtools.parser.assembly.metamodel.Port(v1); :} ; value ::= STRING:v1 {: RESULT = new ccmtools.parser.assembly.metamodel.Text(v1); :} | NUMBER:v1 {: RESULT = new ccmtools.parser.assembly.metamodel.Number(v1); :} ; --- NEW FILE: bnf.txt --- BNF for ccmtools assemblies --------------------------- model := (model_element)* model_element := module | assembly module := "module" NAME "{" (model_element)* "}" ";" assembly := "assembly" NAME "implements" QN "{" (assembly_element)* "}" ";" assembly_element := component | connection | attribute | constant component := "component" QN NAME ";" connection := "connect" port "to" port ";" port := external_port | internal_port external_port := NAME | "this" "." NAME internal_port := NAME "." NAME attribute := "attribute" internal_port "=" external_port ";" constant := "constant" internal_port "=" TEXT ";" QN := ("::")? NAME ("::" NAME)* --- NEW FILE: Main.java --- /* * Created on Feb 5, 2007 * * R&D Salomon Automation (http://www.salomon.at) * * Robert Lechner (rob...@sa...) * * $Id: Main.java,v 1.3.2.1 2007/02/13 13:56:48 teiniker Exp $ */ package ccmtools.parser.assembly; import java.io.FileReader; import ccmtools.parser.assembly.metamodel.Model; public final class Main { public static void main( String[] args ) { if (args.length != 1) { Main m = new Main(); System.err.println(m.getClass().getName() + " assembly-description-file"); System.exit(1); } else try { Model m = Main.parse(args[0]); m.prettyPrint(System.out); } catch (Exception e) { e.printStackTrace(System.err); System.exit(1); } } public static Model parse( String assembly_description_file ) throws Exception { FileReader reader = new FileReader(assembly_description_file); AssemblyLexer lexer = new AssemblyLexer(reader); lexer.current_input_filename = assembly_description_file; AssemblyParser parser = new AssemblyParser(lexer); parser.current_input_filename = assembly_description_file; java_cup.runtime.Symbol root = parser.parse(); if (root == null || root.value == null) throw new NullPointerException("parsing failed"); if (!(root.value instanceof Model)) throw new IllegalStateException("invalid root element: " + root.value.getClass().getName()); Model result = (Model) root.value; result.postProcessing(); return result; } } --- NEW FILE: assembly.flex --- // JFlex lexer definition for ccmtools assembly descriptions package ccmtools.parser.assembly; import java_cup.runtime.*; %% %class AssemblyLexer %unicode %line %column %cup %{ private Symbol symbol(int type) { return new Symbol(type, yyline, yycolumn); } private Symbol symbol(int type, Object value) { return new Symbol(type, yyline, yycolumn, value); } String current_input_filename = "(filename not set)"; public void error(String message) { StringBuilder out = new StringBuilder(); out.append(current_input_filename); out.append(" line "); out.append(yyline); out.append(": "); out.append(message); throw new RuntimeException(out.toString()); } StringBuffer string = new StringBuffer(); %} LineTerminator = \r|\n|\r\n InputCharacter = [^\r\n] WhiteSpace = {LineTerminator} | [ \t\f] Comment = {TraditionalComment} | {EndOfLineComment} TraditionalComment = "/*" {CommentContent} "*"+ "/" EndOfLineComment = "//" {InputCharacter}* {LineTerminator} CommentContent = ( [^*] | \*+ [^*/] )* PreprocessorLine = "#" {InputCharacter}* {LineTerminator} Digit = [0-9] Alpha = [a-zA-Z_] Identifier = {Alpha} ({Alpha}|{Digit})* QualifiedName = {GlobalName} | {ScopedName} GlobalName = "::" {Identifier} ScopedName = "::"? {Identifier} "::" {Identifier} ("::" {Identifier})* OctDigit = [0-7] StringCharacter = [^\r\n\"\\] Number = {DecInteger} | {HexInteger} | {Double} DecInteger = ("+" | "-")? {Digit}+ HexInteger = ("0x" | "0X") [0-9a-fA-F]+ Double = ("+" | "-")? ({Double1} | {Double2} | {Double3} | {Double4}) Double1 = {Digit}+ "." {Digit}* Double2 = {Digit}* "." {Digit}+ Double3 = {Digit}+ ("e" | "E") {DecInteger} Double4 = ({Double1} | {Double2}) ("e" | "E") {DecInteger} %state STRING %% <YYINITIAL> { /* reserved words */ "assembly" { return symbol(sym.ASSEMBLY); } "attribute" { return symbol(sym.ATTRIBUTE); } "component" { return symbol(sym.COMPONENT); } "connect" { return symbol(sym.CONNECT); } "constant" { return symbol(sym.CONSTANT); } "implements" { return symbol(sym.IMPLEMENTS); } "module" { return symbol(sym.MODULE); } "this" { return symbol(sym.THIS); } "to" { return symbol(sym.TO); } /* operators and separators */ ";" { return symbol(sym.SEMICOLON); } "." { return symbol(sym.DOT); } "{" { return symbol(sym.LBRACE); } "}" { return symbol(sym.RBRACE); } "=" { return symbol(sym.EQUAL); } /* string literal */ "\"" { yybegin(STRING); string.setLength(0); } /* comments */ {Comment} { /* ignore */ } /* whitespace */ {WhiteSpace} { /* ignore */ } /* preprocessor line */ {PreprocessorLine} { /* ignore */ } /* numbers */ {Number} { return symbol(sym.NUMBER, yytext()); } /* qualified names */ {QualifiedName} { return symbol(sym.QN, yytext()); } /* identifers, after reserved words!!! */ {Identifier} { return symbol(sym.NAME, yytext()); } /* all other chars report an error */ [^\n\r] { error("Illegal character '" + yytext() + "'"); } } <STRING> { "\"" { yybegin(YYINITIAL); return symbol(sym.STRING, string.toString()); } {StringCharacter}+ { string.append( yytext() ); } /* escape sequences */ "\\b" { string.append( '\b' ); } "\\t" { string.append( '\t' ); } "\\n" { string.append( '\n' ); } "\\f" { string.append( '\f' ); } "\\r" { string.append( '\r' ); } "\\\"" { string.append( '\"' ); } "\\'" { string.append( '\'' ); } "\\\\" { string.append( '\\' ); } \\[0-3]?{OctDigit}?{OctDigit} { char val = (char) Integer.parseInt(yytext().substring(1),8); string.append( val ); } /* error cases */ \\. { throw new RuntimeException("Illegal escape sequence \"" +yytext()+"\""); } {LineTerminator} { throw new RuntimeException("Unterminated string at end of line"); } } |