diff options
Diffstat (limited to 'runtime/CSharp3/Sources/Antlr3.Runtime/Tree/TreePatternLexer.cs')
-rw-r--r-- | runtime/CSharp3/Sources/Antlr3.Runtime/Tree/TreePatternLexer.cs | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/TreePatternLexer.cs b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/TreePatternLexer.cs new file mode 100644 index 0000000..e742205 --- /dev/null +++ b/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/TreePatternLexer.cs @@ -0,0 +1,162 @@ +/* + * [The "BSD licence"] + * Copyright (c) 2005-2008 Terence Parr + * All rights reserved. + * + * Conversion to C#: + * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Antlr.Runtime.Tree +{ + using StringBuilder = System.Text.StringBuilder; + + public class TreePatternLexer + { + public const int Begin = 1; + public const int End = 2; + public const int Id = 3; + public const int Arg = 4; + public const int Percent = 5; + public const int Colon = 6; + public const int Dot = 7; + + /** <summary>The tree pattern to lex like "(A B C)"</summary> */ + protected string pattern; + + /** <summary>Index into input string</summary> */ + protected int p = -1; + + /** <summary>Current char</summary> */ + protected int c; + + /** <summary>How long is the pattern in char?</summary> */ + protected int n; + + /** <summary>Set when token type is ID or ARG (name mimics Java's StreamTokenizer)</summary> */ + public StringBuilder sval = new StringBuilder(); + + public bool error = false; + + public TreePatternLexer( string pattern ) + { + this.pattern = pattern; + this.n = pattern.Length; + Consume(); + } + + public virtual int NextToken() + { + sval.Length = 0; // reset, but reuse buffer + while ( c != CharStreamConstants.EndOfFile ) + { + if ( c == ' ' || c == '\n' || c == '\r' || c == '\t' ) + { + Consume(); + continue; + } + if ( ( c >= 'a' && c <= 'z' ) || ( c >= 'A' && c <= 'Z' ) || c == '_' ) + { + sval.Append( (char)c ); + Consume(); + while ( ( c >= 'a' && c <= 'z' ) || ( c >= 'A' && c <= 'Z' ) || + ( c >= '0' && c <= '9' ) || c == '_' ) + { + sval.Append( (char)c ); + Consume(); + } + return Id; + } + if ( c == '(' ) + { + Consume(); + return Begin; + } + if ( c == ')' ) + { + Consume(); + return End; + } + if ( c == '%' ) + { + Consume(); + return Percent; + } + if ( c == ':' ) + { + Consume(); + return Colon; + } + if ( c == '.' ) + { + Consume(); + return Dot; + } + if ( c == '[' ) + { + // grab [x] as a string, returning x + Consume(); + while ( c != ']' ) + { + if ( c == '\\' ) + { + Consume(); + if ( c != ']' ) + { + sval.Append( '\\' ); + } + sval.Append( (char)c ); + } + else + { + sval.Append( (char)c ); + } + Consume(); + } + Consume(); + return Arg; + } + Consume(); + error = true; + return CharStreamConstants.EndOfFile; + } + return CharStreamConstants.EndOfFile; + } + + protected virtual void Consume() + { + p++; + if ( p >= n ) + { + c = CharStreamConstants.EndOfFile; + } + else + { + c = pattern[p]; + } + } + } +} |