using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace Core.StlMes
{
///
/// 语法分析基类
///
public class SyntaxEngine
{
///
/// 语法项
///
public class SyntaxItem
{
private string FPattern; // 正则表达式
private RegexOptions FOptions; // 正则表达式附加选项
private string FName; // 语法名称
private int FIndex; // 序号
public string Pattern { get { return FPattern; } } // 正则表达式
public RegexOptions Options { get { return FOptions; } } // 正则表达式附加选项
public string Name { get { return FName; } } // 名称
public int Index { get { return FIndex; } } // 序号
public SyntaxItem(string APattern, RegexOptions AOptions,
string AName, int AIndex)
{
FPattern = APattern;
FOptions = AOptions;
FName = AName;
FIndex = AIndex;
}
}
///
/// 语法分析返回项
///
public class AnalyzeReslut
{
private SyntaxItem FItem; // 所属语法项
private string FBlock; // 文字块
public SyntaxItem Item { get { return FItem; } }
public string Block { get { return FBlock; } }
public AnalyzeReslut(SyntaxItem AItem, string ABlock)
{
FItem = AItem;
FBlock = ABlock;
}
}
private List FSyntaxItems = new List();
private List FAnalyzeResluts = new List();
public List SyntaxItems { get { return FSyntaxItems; } }
public List AnalyzeResluts { get { return FAnalyzeResluts; } }
///
/// 进行语法分析
///
/// 所分析的代码
/// 返回分析是否成功
public virtual bool Analyze(string ACode)
{
if (FSyntaxItems.Count <= 0)
return false;
if (ACode == null)
return false;
AnalyzeResluts.Clear();
string vCode = ACode;
bool vFind = true;
while (vFind && (vCode.Length > 0))
{
vFind = false;
foreach (SyntaxItem vSyntaxItem in FSyntaxItems)
{
bool reg = Regex.IsMatch(vCode, vSyntaxItem.Pattern, vSyntaxItem.Options);
if (reg)
{
AnalyzeResluts.Add(new AnalyzeReslut(vSyntaxItem,
Regex.Match(vCode, vSyntaxItem.Pattern,
vSyntaxItem.Options).Value));
vCode = Regex.Replace(vCode, vSyntaxItem.Pattern, "",
vSyntaxItem.Options);
vFind = true;
break;
}
}
}
return true;
}
}
}