Skip to content

Commit

Permalink
Merge 44db874 into 7919cd6
Browse files Browse the repository at this point in the history
  • Loading branch information
b3b00 authored May 3, 2019
2 parents 7919cd6 + 44db874 commit f4fb30e
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 35 deletions.
33 changes: 28 additions & 5 deletions ParserTests/GenericLexerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,15 @@ public enum AlphaNumDashId
ID
}

public enum Issue106
{
[Lexeme(GenericToken.Int)]
Integer = 5,

[Lexeme(GenericToken.Double)]
Double = 6,
}

public class GenericLexerTests
{
[Fact]
Expand Down Expand Up @@ -365,13 +374,27 @@ public void TestTokenCallbacks()
Assert.False(res.IsError);
var lexer = res.Result as GenericLexer<CallbackTokens>;
CallBacksBuilder.BuildCallbacks<CallbackTokens>(lexer);


var tokens = lexer.Tokenize("aaa bbb").ToList();
Assert.Equal(3,tokens.Count);
Assert.Equal("AAA",tokens[0].Value);
Assert.Equal("BBB",tokens[1].Value);
Assert.Equal(CallbackTokens.SKIP,tokens[1].TokenID);
Assert.Equal(3, tokens.Count);
Assert.Equal("AAA", tokens[0].Value);
Assert.Equal("BBB", tokens[1].Value);
Assert.Equal(CallbackTokens.SKIP, tokens[1].TokenID);
}

[Fact]
public void TestIssue106()
{
var res = LexerBuilder.BuildLexer(new BuildResult<ILexer<Issue106>>());
Assert.False(res.IsError);
var lexer = res.Result as GenericLexer<Issue106>;
var tokens = lexer.Tokenize("1.").ToList();
Assert.NotNull(tokens);
Assert.Equal(2,tokens.Count);
var token = tokens[0];
Assert.Equal(Issue106.Integer,token.TokenID);
Assert.Equal(1,token.IntValue);
}
}
}
2 changes: 2 additions & 0 deletions sly/buildresult/BuildResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ public bool IsError
set { }
}

public bool IsOk => !IsError;

public void AddError(InitializationError error)
{
Errors.Add(error);
Expand Down
35 changes: 5 additions & 30 deletions sly/lexer/fsm/FSMLexer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,34 +17,6 @@ public static T At<T>(this ReadOnlyMemory<T> memory, int index)

public delegate void BuildExtension<IN>(IN token, LexemeAttribute lexem, GenericLexer<IN> lexer) where IN : struct;

public class FSMMatch<N>
{
public char StringDelimiter = '"';

public FSMMatch(bool success)
{
IsSuccess = success;
}

public FSMMatch(bool success, N result, string value, TokenPosition position) : this(success,result,new ReadOnlyMemory<char>(value.ToCharArray()),position )
{

}

public FSMMatch(bool success, N result, ReadOnlyMemory<char> value, TokenPosition position)
{
Properties = new Dictionary<string, object>();
IsSuccess = success;
Result = new Token<N>(result, value, position);
}

public Dictionary<string, object> Properties { get; set; }

public bool IsSuccess { get; set; }

public Token<N> Result { get; set; }
}

public class FSMLexer<N>
{
private readonly Dictionary<int, FSMNode<N>> Nodes;
Expand Down Expand Up @@ -278,7 +250,7 @@ public FSMMatch<N> Run( ReadOnlyMemory<char> source, int start)

if (currentNode.IsEnd)
{
var resultInter = new FSMMatch<N>(true, currentNode.Value, value, position);
var resultInter = new FSMMatch<N>(true, currentNode.Value, value, position,currentNode.Id);
successes.Push(resultInter);
}

Expand All @@ -300,7 +272,10 @@ public FSMMatch<N> Run( ReadOnlyMemory<char> source, int start)
if (successes.Any())
{
result = successes.Pop();
if (HasCallback(lastNode)) result = Callbacks[lastNode](result);
if (HasCallback(result.NodeId))
{
result = Callbacks[result.NodeId](result);
}
}

return result;
Expand Down
38 changes: 38 additions & 0 deletions sly/lexer/fsm/FSMMatch.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;

namespace sly.lexer.fsm
{
public class FSMMatch<N>
{
public char StringDelimiter = '"';


public Dictionary<string, object> Properties { get; set; }

public bool IsSuccess { get; set; }

public Token<N> Result { get; set; }

public int NodeId { get; set; }
public FSMMatch(bool success)
{
IsSuccess = success;
}

public FSMMatch(bool success, N result, string value, TokenPosition position,int nodeId) : this(success,result,new ReadOnlyMemory<char>(value.ToCharArray()),position,nodeId )
{

}

public FSMMatch(bool success, N result, ReadOnlyMemory<char> value, TokenPosition position, int nodeId)
{
Properties = new Dictionary<string, object>();
IsSuccess = success;
NodeId = nodeId;
Result = new Token<N>(result, value, position);
}


}
}

0 comments on commit f4fb30e

Please sign in to comment.