001: /*
002: * CSharpElement.java
003: *
004: * This work is free software; you can redistribute it and/or modify
005: * it under the terms of the GNU General Public License as published
006: * by the Free Software Foundation; either version 2 of the License,
007: * or (at your option) any later version.
008: *
009: * This work is distributed in the hope that it will be useful, but
010: * WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * General Public License for more details.
013: *
014: * You should have received a copy of the GNU General Public License
015: * along with this program; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
017: * USA
018: *
019: * As a special exception, the copyright holders of this library give
020: * you permission to link this library with independent modules to
021: * produce an executable, regardless of the license terms of these
022: * independent modules, and to copy and distribute the resulting
023: * executable under terms of your choice, provided that you also meet,
024: * for each linked independent module, the terms and conditions of the
025: * license of that module. An independent module is a module which is
026: * not derived from or based on this library. If you modify this
027: * library, you may extend this exception to your version of the
028: * library, but you are not obligated to do so. If you do not wish to
029: * do so, delete this exception statement from your version.
030: *
031: * Copyright (c) 2003 Per Cederberg. All rights reserved.
032: */
033:
034: package net.percederberg.grammatica.ant;
035:
036: import java.io.File;
037: import java.io.IOException;
038:
039: import org.apache.tools.ant.BuildException;
040:
041: import net.percederberg.grammatica.Grammar;
042: import net.percederberg.grammatica.output.CSharpParserGenerator;
043:
044: /**
045: * A C# output element. This element creates C# source code for a
046: * parser.
047: *
048: * @author Per Cederberg, <per at percederberg dot net>
049: * @version 1.4
050: * @since 1.4
051: */
052: public class CSharpElement implements ProcessingElement {
053:
054: /**
055: * The output directory.
056: */
057: private File dir = null;
058:
059: /**
060: * The namespace name.
061: */
062: private String namespace = null;
063:
064: /**
065: * The class name prefix.
066: */
067: private String prefix = null;
068:
069: /**
070: * The public access flag.
071: */
072: private boolean publicAccess = false;
073:
074: /**
075: * Creates a new C# output element.
076: */
077: public CSharpElement() {
078: }
079:
080: /**
081: * Sets the output directory.
082: *
083: * @param dir the new output directory
084: */
085: public void setDir(File dir) {
086: this .dir = dir;
087: }
088:
089: /**
090: * Sets the output namespace. By default no namespace declaration
091: * will be used.
092: *
093: * @param namespace the new output namespace
094: */
095: public void setNamespace(String namespace) {
096: this .namespace = namespace;
097: }
098:
099: /**
100: * Sets the output class name prefix. By default the grammar file
101: * name will be used.
102: *
103: * @param prefix the new output class name prefix
104: */
105: public void setPrefix(String prefix) {
106: this .prefix = prefix;
107: }
108:
109: /**
110: * Sets the public access to types flag. By default only internal
111: * access is allowed.
112: *
113: * @param publicAccess the public access flag
114: */
115: public void setPublic(boolean publicAccess) {
116: this .publicAccess = publicAccess;
117: }
118:
119: /**
120: * Validates all attributes in the element.
121: *
122: * @throws BuildException if some attribute was missing or had an
123: * invalid value
124: */
125: public void validate() throws BuildException {
126: if (dir == null) {
127: throw new BuildException(
128: "missing 'dir' attribute in <csharp> element");
129: }
130: }
131:
132: /**
133: * Proceses the specified grammar.
134: *
135: * @param grammar the grammar to process
136: *
137: * @throws BuildException if the grammar couldn't be processed
138: * correctly
139: */
140: public void process(Grammar grammar) throws BuildException {
141: CSharpParserGenerator gen = new CSharpParserGenerator(grammar);
142:
143: gen.setBaseDir(dir);
144: if (namespace != null) {
145: gen.setNamespace(namespace);
146: }
147: if (prefix != null) {
148: gen.setBaseName(prefix);
149: }
150: gen.setPublicAccess(publicAccess);
151: try {
152: System.out.println("Writing C# parser source code...");
153: gen.write();
154: System.out.println("Done.");
155: } catch (IOException e) {
156: throw new BuildException(e);
157: }
158: }
159: }
|