001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.modules.cnd.lexer;
043:
044: import org.netbeans.cnd.api.lexer.CndLexerUtilities;
045: import org.netbeans.cnd.api.lexer.DoxygenTokenId;
046: import org.netbeans.api.lexer.Token;
047: import org.netbeans.spi.lexer.Lexer;
048: import org.netbeans.spi.lexer.LexerInput;
049: import org.netbeans.spi.lexer.LexerRestartInfo;
050: import org.netbeans.spi.lexer.TokenFactory;
051:
052: /**
053: * Lexical analyzer for doxygen language.
054: * based on JavadocLexer
055: *
056: * @author Vladimir Voskresensky
057: * @version 1.00
058: */
059:
060: public class DoxygenLexer implements Lexer<DoxygenTokenId> {
061:
062: private static final int EOF = LexerInput.EOF;
063:
064: private LexerInput input;
065:
066: private TokenFactory<DoxygenTokenId> tokenFactory;
067:
068: public DoxygenLexer(LexerRestartInfo<DoxygenTokenId> info) {
069: this .input = info.input();
070: this .tokenFactory = info.tokenFactory();
071: assert (info.state() == null); // passed argument always null
072: }
073:
074: public Object state() {
075: return null;
076: }
077:
078: public Token<DoxygenTokenId> nextToken() {
079: int ch = input.read();
080:
081: if (ch == EOF) {
082: return null;
083: }
084:
085: if (CndLexerUtilities.isCppIdentifierStart(ch)) {
086: //TODO: EOF
087: while (CndLexerUtilities.isCppIdentifierPart(input.read())) {
088: }
089:
090: input.backup(1);
091: return token(DoxygenTokenId.IDENT);
092: }
093:
094: if ("@<.#".indexOf(ch) == (-1)) {
095: //TODO: EOF
096: ch = input.read();
097:
098: while (!CndLexerUtilities.isCppIdentifierStart(ch)
099: && "@<.#".indexOf(ch) == (-1) && ch != EOF)
100: ch = input.read();
101:
102: if (ch != EOF)
103: input.backup(1);
104: return token(DoxygenTokenId.OTHER_TEXT);
105: }
106:
107: switch (ch) {
108: case '@':
109: while (true) {
110: ch = input.read();
111:
112: if (!Character.isLetter(ch)) {
113: input.backup(1);
114: return tokenFactory.createToken(DoxygenTokenId.TAG,
115: input.readLength());
116: }
117: }
118: case '<':
119: while (true) {
120: ch = input.read();
121: if (ch == '>' || ch == EOF) {
122: return token(DoxygenTokenId.HTML_TAG);
123: }
124: }
125: case '.':
126: return token(DoxygenTokenId.DOT);
127: case '#':
128: return token(DoxygenTokenId.HASH);
129: } // end of switch (ch)
130:
131: assert false;
132:
133: return null;
134: }
135:
136: private Token<DoxygenTokenId> token(DoxygenTokenId id) {
137: return tokenFactory.createToken(id);
138: }
139:
140: public void release() {
141: }
142:
143: }
|