60 lines
1.1 KiB
C#
60 lines
1.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
namespace sharp.parser
|
|
{
|
|
public class Lexer
|
|
{
|
|
List<TokenDefinition> tokenDefinitions = new List<TokenDefinition>();
|
|
|
|
public Lexer(){
|
|
}
|
|
public Lexer(TokenDefinition[] tokenDefinitions)
|
|
{
|
|
this.tokenDefinitions.AddRange(tokenDefinitions);
|
|
}
|
|
|
|
public void AddTokenDefinition(TokenDefinition tokenDefinition)
|
|
{
|
|
this.tokenDefinitions.Add(tokenDefinition);
|
|
}
|
|
public void RemoveTokenDefinition(TokenDefinition tokenDefinition)
|
|
{
|
|
this.tokenDefinitions.Remove(tokenDefinition);
|
|
}
|
|
|
|
|
|
public Token[] parse(CharBuffer buffer){
|
|
List<Token> tokens = new List<Token>();
|
|
|
|
while (!buffer.EndOfBuffer()){
|
|
Token t = null;
|
|
|
|
foreach (TokenDefinition tdef in tokenDefinitions)
|
|
{
|
|
t = tdef.tryParse(buffer);
|
|
if (t != null)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (t == null)
|
|
{
|
|
break;
|
|
}
|
|
|
|
tokens.Add(t);
|
|
}
|
|
|
|
if (!buffer.EndOfBuffer())
|
|
{
|
|
throw new FormatException(String.Format("Unexpected character at line {0} position {1}. '{2}'", buffer.CurrentLineNumber, buffer.CurrentLinePosition, buffer.Current));
|
|
}
|
|
return tokens.ToArray();
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|