Files
Flee/Parsing/TokenPattern.cs
2025-10-08 09:49:37 +08:00

304 lines
6.7 KiB
C#

using System.Text;
namespace Flee.Parsing
{
/**
* A token pattern. This class contains the definition of a token
* (i.e. it's pattern), and allows testing a string against this
* pattern. A token pattern is uniquely identified by an integer id,
* that must be provided upon creation.
*
*/
internal class TokenPattern
{
public enum PatternType
{
/**
* The string pattern type is used for tokens that only
* match an exact string.
*/
STRING,
/**
* The regular expression pattern type is used for tokens
* that match a regular expression.
*/
REGEXP
}
private int _id;
private string _name;
private PatternType _type;
private string _pattern;
private bool _error;
private string _errorMessage;
private bool _ignore;
private string _ignoreMessage;
private string _debugInfo;
public TokenPattern(int id,
string name,
PatternType type,
string pattern)
{
this._id = id;
this._name = name;
this._type = type;
this._pattern = pattern;
}
public int Id
{
get
{
return _id;
}
set { _id = value; }
}
public int GetId()
{
return _id;
}
public string Name
{
get
{
return _name;
}
set { _name = value; }
}
public string GetName()
{
return _name;
}
public PatternType Type
{
get
{
return _type;
}
set { _type = value; }
}
public PatternType GetPatternType()
{
return _type;
}
public string Pattern
{
get
{
return _pattern;
}
set { _pattern = value; }
}
public string GetPattern()
{
return _pattern;
}
public bool Error
{
get
{
return _error;
}
set
{
_error = value;
if (_error && _errorMessage == null)
{
_errorMessage = "unrecognized token found";
}
}
}
public string ErrorMessage
{
get
{
return _errorMessage;
}
set
{
_error = true;
_errorMessage = value;
}
}
public bool IsError()
{
return Error;
}
public string GetErrorMessage()
{
return ErrorMessage;
}
public void SetError()
{
Error = true;
}
public void SetError(string message)
{
ErrorMessage = message;
}
public bool Ignore
{
get
{
return _ignore;
}
set
{
_ignore = value;
}
}
public string IgnoreMessage
{
get
{
return _ignoreMessage;
}
set
{
_ignore = true;
_ignoreMessage = value;
}
}
public bool IsIgnore()
{
return Ignore;
}
public string GetIgnoreMessage()
{
return IgnoreMessage;
}
public void SetIgnore()
{
Ignore = true;
}
public void SetIgnore(string message)
{
IgnoreMessage = message;
}
public string DebugInfo
{
get
{
return _debugInfo;
}
set
{
_debugInfo = value;
}
}
public override string ToString()
{
StringBuilder buffer = new StringBuilder();
buffer.Append(_name);
buffer.Append(" (");
buffer.Append(_id);
buffer.Append("): ");
switch (_type)
{
case PatternType.STRING:
buffer.Append("\"");
buffer.Append(_pattern);
buffer.Append("\"");
break;
case PatternType.REGEXP:
buffer.Append("<<");
buffer.Append(_pattern);
buffer.Append(">>");
break;
}
if (_error)
{
buffer.Append(" ERROR: \"");
buffer.Append(_errorMessage);
buffer.Append("\"");
}
if (_ignore)
{
buffer.Append(" IGNORE");
if (_ignoreMessage != null)
{
buffer.Append(": \"");
buffer.Append(_ignoreMessage);
buffer.Append("\"");
}
}
if (_debugInfo != null)
{
buffer.Append("\n ");
buffer.Append(_debugInfo);
}
return buffer.ToString();
}
public string ToShortString()
{
StringBuilder buffer = new StringBuilder();
int newline = _pattern.IndexOf('\n');
if (_type == PatternType.STRING)
{
buffer.Append("\"");
if (newline >= 0)
{
if (newline > 0 && _pattern[newline - 1] == '\r')
{
newline--;
}
buffer.Append(_pattern.Substring(0, newline));
buffer.Append("(...)");
}
else
{
buffer.Append(_pattern);
}
buffer.Append("\"");
}
else
{
buffer.Append("<");
buffer.Append(_name);
buffer.Append(">");
}
return buffer.ToString();
}
public void SetData(int id, string name, PatternType type, string pattern)
{
Id = id;
Name = name;
Type = type;
Pattern = pattern;
}
}
}