Browse Source

implemented state handling in ILexer and AbstractLexer to make it publicly available

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/vbnet@6084 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 16 years ago
parent
commit
c319e92477
  1. 3
      src/Libraries/NRefactory/Project/NRefactory.csproj
  2. 21
      src/Libraries/NRefactory/Project/Src/Lexer/AbstractLexer.cs
  3. 17
      src/Libraries/NRefactory/Project/Src/Lexer/AbstractLexerState.cs
  4. 12
      src/Libraries/NRefactory/Project/Src/Lexer/ILexer.cs
  5. 62
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs
  6. 23
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/VBLexerState.cs
  7. 33
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/XmlModeInfo.cs
  8. 13
      src/Libraries/NRefactory/Project/Src/ParserFactory.cs

3
src/Libraries/NRefactory/Project/NRefactory.csproj

@ -61,6 +61,7 @@ @@ -61,6 +61,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="Src\Lexer\LATextReader.cs" />
<Compile Include="Src\Lexer\AbstractLexerState.cs" />
<Compile Include="Src\Lexer\VBNet\ExpressionFinder.cs" />
<Compile Include="Src\Lexer\VBNet\Parser.cs">
<DependentUpon>ExpressionFinder.atg</DependentUpon>
@ -90,6 +91,8 @@ @@ -90,6 +91,8 @@
<Compile Include="..\..\..\Main\GlobalAssemblyInfo.cs">
<Link>Configuration\GlobalAssemblyInfo.cs</Link>
</Compile>
<Compile Include="Src\Lexer\VBNet\VBLexerState.cs" />
<Compile Include="Src\Lexer\VBNet\XmlModeInfo.cs" />
<Compile Include="Src\OperatorPrecedence.cs" />
<Compile Include="Src\Parser\CSharp\CSharpParser.cs" />
<Compile Include="Src\Parser\CSharp\Parser.cs" />

21
src/Libraries/NRefactory/Project/Src/Lexer/AbstractLexer.cs

@ -196,6 +196,13 @@ namespace ICSharpCode.NRefactory.Parser @@ -196,6 +196,13 @@ namespace ICSharpCode.NRefactory.Parser
this.reader = new LATextReader(reader);
}
protected AbstractLexer(TextReader reader, AbstractLexerState state)
: this(reader)
{
SetInitialLocation(new Location(state.Column, state.Line));
lastToken = new Token(state.PrevTokenKind, 0, 0);
}
#region System.IDisposable interface implementation
public virtual void Dispose()
{
@ -360,5 +367,19 @@ namespace ICSharpCode.NRefactory.Parser @@ -360,5 +367,19 @@ namespace ICSharpCode.NRefactory.Parser
/// After the call, Lexer.LookAhead will be the block-closing token.
/// </summary>
public abstract void SkipCurrentBlock(int targetToken);
public event EventHandler SavepointReached;
protected virtual void OnSavepointReached(EventArgs e)
{
if (SavepointReached != null) {
SavepointReached(this, e);
}
}
public virtual AbstractLexerState Export()
{
throw new NotSupportedException();
}
}
}

17
src/Libraries/NRefactory/Project/Src/Lexer/AbstractLexerState.cs

@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Siegfried Pammer" email="siegfriedpammer@gmail.com" />
// <version>$Revision$</version>
// </file>
using System;
namespace ICSharpCode.NRefactory.Parser
{
public abstract class AbstractLexerState
{
public int Line { get; set; }
public int Column { get; set; }
public int PrevTokenKind { get; set; }
}
}

12
src/Libraries/NRefactory/Project/Src/Lexer/ILexer.cs

@ -106,5 +106,17 @@ namespace ICSharpCode.NRefactory.Parser @@ -106,5 +106,17 @@ namespace ICSharpCode.NRefactory.Parser
/// After the call, Lexer.LookAhead will be the block-closing token.
/// </summary>
void SkipCurrentBlock(int targetToken);
/// <summary>
/// Used to export the current state of the lexer. The exported state should be
/// complete, so that it is possible to reset the lexer to a previous state completely.
/// </summary>
AbstractLexerState Export();
/// <summary>
/// Is fired by the lexer as soon as a savepoint is reached.
/// The Export-method can be used to retrieve the current state.
/// </summary>
event EventHandler SavepointReached;
}
}

62
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs

@ -34,17 +34,19 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -34,17 +34,19 @@ namespace ICSharpCode.NRefactory.Parser.VB
ef = new ExpressionFinder();
}
public Lexer(TextReader reader, LexerState state) : base(reader)
public Lexer(TextReader reader, AbstractLexerState state) : base(reader, state)
{
ef = new ExpressionFinder(state.ExpressionFinder);
SetInitialLocation(new Location(state.Column, state.Line));
lineEnd = state.LineEnd;
isAtLineBegin = state.IsAtLineBegin;
lastToken = new Token(state.PrevTokenKind, 0, 0);
encounteredLineContinuation = state.EncounteredLineContinuation;
misreadExclamationMarkAsTypeCharacter = state.MisreadExclamationMarkAsTypeCharacter;
xmlModeStack = new Stack<XmlModeInfo>(state.XmlModeInfoStack.Select(i => (XmlModeInfo)i.Clone()).Reverse());
inXmlMode = state.InXmlMode;
if (!(state is VBLexerState))
throw new InvalidOperationException("state must be a VBLexerState");
var vbState = state as VBLexerState;
ef = new ExpressionFinder(vbState.ExpressionFinder);
lineEnd = vbState.LineEnd;
isAtLineBegin = vbState.IsAtLineBegin;
encounteredLineContinuation = vbState.EncounteredLineContinuation;
misreadExclamationMarkAsTypeCharacter = vbState.MisreadExclamationMarkAsTypeCharacter;
xmlModeStack = new Stack<XmlModeInfo>(vbState.XmlModeInfoStack.Select(i => (XmlModeInfo)i.Clone()).Reverse());
inXmlMode = vbState.InXmlMode;
}
Token NextInternal()
@ -1131,9 +1133,9 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -1131,9 +1133,9 @@ namespace ICSharpCode.NRefactory.Parser.VB
ef.SetContext(type);
}
public LexerState Export()
public override AbstractLexerState Export()
{
return new LexerState() {
return new VBLexerState() {
Column = Col,
Line = Line,
EncounteredLineContinuation = encounteredLineContinuation,
@ -1147,40 +1149,4 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -1147,40 +1149,4 @@ namespace ICSharpCode.NRefactory.Parser.VB
};
}
}
public class XmlModeInfo : ICloneable
{
public bool inXmlTag, inXmlCloseTag, isDocumentStart;
public int level;
public XmlModeInfo(bool isSpecial)
{
level = isSpecial ? -1 : 0;
inXmlTag = inXmlCloseTag = isDocumentStart = false;
}
public object Clone()
{
return new XmlModeInfo(false) {
inXmlCloseTag = this.inXmlCloseTag,
inXmlTag = this.inXmlTag,
isDocumentStart = this.isDocumentStart,
level = this.level
};
}
}
public class LexerState
{
public bool LineEnd { get; set; }
public bool IsAtLineBegin { get; set; }
public bool MisreadExclamationMarkAsTypeCharacter { get; set; }
public bool EncounteredLineContinuation { get; set; }
public ExpressionFinderState ExpressionFinder { get; set; }
public Stack<XmlModeInfo> XmlModeInfoStack { get; set; }
public bool InXmlMode { get; set; }
public int Line { get; set; }
public int Column { get; set; }
public int PrevTokenKind { get; set; }
}
}

23
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/VBLexerState.cs

@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Siegfried Pammer" email="siegfriedpammer@gmail.com" />
// <version>$Revision: 6083 $</version>
// </file>
using System;
using System.Collections.Generic;
namespace ICSharpCode.NRefactory.Parser.VB
{
public sealed class VBLexerState : AbstractLexerState
{
public bool LineEnd { get; set; }
public bool IsAtLineBegin { get; set; }
public bool MisreadExclamationMarkAsTypeCharacter { get; set; }
public bool EncounteredLineContinuation { get; set; }
public ExpressionFinderState ExpressionFinder { get; set; }
public Stack<XmlModeInfo> XmlModeInfoStack { get; set; }
public bool InXmlMode { get; set; }
}
}

33
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/XmlModeInfo.cs

@ -0,0 +1,33 @@ @@ -0,0 +1,33 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Siegfried Pammer" email="siegfriedpammer@gmail.com" />
// <version>$Revision: 6083 $</version>
// </file>
using System;
namespace ICSharpCode.NRefactory.Parser.VB
{
public class XmlModeInfo : ICloneable
{
public bool inXmlTag, inXmlCloseTag, isDocumentStart;
public int level;
public XmlModeInfo(bool isSpecial)
{
level = isSpecial ? -1 : 0;
inXmlTag = inXmlCloseTag = isDocumentStart = false;
}
public object Clone()
{
return new XmlModeInfo(false) {
inXmlCloseTag = this.inXmlCloseTag,
inXmlTag = this.inXmlTag,
isDocumentStart = this.isDocumentStart,
level = this.level
};
}
}
}

13
src/Libraries/NRefactory/Project/Src/ParserFactory.cs

@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
using System;
using System.IO;
using System.Text;
using ICSharpCode.NRefactory.Parser;
namespace ICSharpCode.NRefactory
{
@ -32,6 +33,18 @@ namespace ICSharpCode.NRefactory @@ -32,6 +33,18 @@ namespace ICSharpCode.NRefactory
throw new System.NotSupportedException(language + " not supported.");
}
public static Parser.ILexer CreateLexer(SupportedLanguage language, TextReader textReader, AbstractLexerState state)
{
switch (language) {
case SupportedLanguage.CSharp:
//return new ICSharpCode.NRefactory.Parser.CSharp.Lexer(textReader, state);
throw new System.NotSupportedException("C# Lexer does not support loading a previous state.");
case SupportedLanguage.VBNet:
return new ICSharpCode.NRefactory.Parser.VB.Lexer(textReader, state);
}
throw new System.NotSupportedException(language + " not supported.");
}
public static IParser CreateParser(SupportedLanguage language, TextReader textReader)
{
Parser.ILexer lexer = CreateLexer(language, textReader);

Loading…
Cancel
Save