// QTL.cs
using System;
using System.Collections;
using System.IO; namespace SEI.DL88250.SourceCodes.CSharp.QTL
{
/// <summary>查询系统类
/// </summary>
public class QTL
{
/// <summary>文本缓冲区
/// </summary>
internal static ArrayList textContentBuffer;
/// <summary>查询结果集,行号集合
/// </summary>
private ArrayList _queryResult;
/// <summary>表达式分析器
/// </summary>
private ExpressionAnalyser _ea;
/// <summary>构造器,初始化文本集
/// </summary>
public QTL()
{
textContentBuffer = new ArrayList();
textContentBuffer.Add(null); // 填掉第0个位置
_queryResult = new ArrayList();
}
/// </summary>
public void ClearResults()
{
_queryResult.Clear();
}
/// </summary>
public void ClearScreen()
{
Console.ReadLine();
Console.Clear();
}
/// </summary>
public void UserInputQuery()
{
Console.Write("Please enter a query or 'q' to Quit: ");
string query = Console.ReadLine();
if ("q" == query)
{
Environment.Exit(0);
}
_ea = new ExpressionAnalyser(query);
}
/// </summary>
public void ProcessQuery()
{
ArrayList expression = _ea.ToPostfix(); // 后缀表达式集
#region 后缀表达式正确性验证显示测试
//IEnumerator ie = expression.GetEnumerator();
//while (ie.MoveNext())
//{
// Console.Write(((Expression)ie.Current).ExpressionString);
//}
//Console.WriteLine();
#endregion 正确性验证显示结束
Stack s = new Stack(); // 运算过程栈
Stack p = new Stack(); // 运算字串栈,用于分步打印
#region 基于后缀表达式进行查询运算与结果分步显示
for (int i = 0; i < expression.Count; i++)
{
Expression exp = (Expression)expression[i];
switch (exp.ExpressionType)
{
case "query":
{
s.Push(new UnitaryQuery(exp.ExpressionString));
#region 打印当前关键字运算的结果
string curExp = exp.ExpressionString;
p.Push((object)curExp);
PrintSetpResult(curExp, s);
#endregion 打印结束
break;
}
case "&&":
{
Query q1 = (Query)s.Pop();
Query q2 = (Query)s.Pop();
s.Push(new AndQuery(q1, q2));
#region 打印当前"&&"运算的结果
string curExp = "";
curExp += (string)p.Pop();
curExp += " && ";
curExp += (string)p.Pop();
p.Push((object)(curExp));
PrintSetpResult(curExp, s);
#endregion 打印结束
break;
}
case "||":
{
Query q1 = (Query)s.Pop();
Query q2 = (Query)s.Pop();
s.Push(new OrQuery(q1, q2));
#region 打印当前"||"运算的结果
string curExp = "";
curExp += (string)p.Pop();
curExp += " || ";
curExp += (string)p.Pop();
//curExp = curExp.Insert(curExp.Length, ")");
p.Push((object)(curExp));
PrintSetpResult(curExp, s);
#endregion 打印结束
break;
}
case "!":
{
Query q = (Query)s.Pop();
s.Push(new NotQuery(q));
#region 打印当前"!"运算的结果
string curExp = "!";
curExp += (string)p.Pop();
p.Push((object)(curExp));
PrintSetpResult(curExp, s);
#endregion 打印结束
break;
}
default:
Console.Error.WriteLine("Expression error!");
break;
}
}
#endregion 核心运算完毕
#region 将结果转换成整型行号数组
for (int i = 0; i < ((Query)s.Peek()).Solution.Count; i++)
{
_queryResult.Add(Convert.ToInt32(((Query)s.Peek()).Solution[i].ToString()));
}
#endregion
}
/// </summary>
/// <param name="curExp">当前表达式字串</param>
/// <param name="s">表达式栈</param>
private void PrintSetpResult(string curExp, Stack s)
{
Console.WriteLine(curExp);
Console.Write(" " + ((Query)s.Peek()).Solution.Count + " line(s) math ");
for (int j = 0; j < ((Query)s.Peek()).Solution.Count; j++)
{
Console.Write(" [{0}] ", ((Query)s.Peek()).Solution[j]);
}
Console.WriteLine();
}
/// </summary>
public void PrintResultDetails()
{
IEnumerator e = _queryResult.GetEnumerator();
while (e.MoveNext())
{
Console.WriteLine("[{0}]: {1}",
e.Current.ToString(), textContentBuffer[Convert.ToInt32(e.Current.ToString())].ToString());
}
}
/// </summary>
public void AddFile()
{
string fileName = "Test.txt";
StreamReader fReader = File.OpenText(fileName);
Console.WriteLine("Reading " + fileName + " -- please wait!");
string aLine = fReader.ReadLine();
for (int i = 1; null != aLine; i++)
{
textContentBuffer.Add((object)(aLine));
aLine = fReader.ReadLine();
}
Console.WriteLine("Reading " + fileName + " -- OK, done!");
Console.WriteLine("The text file " + new FileInfo(fileName).Name + ' '
+ " contains " + textContentBuffer.Count
+ " lines in " + new FileInfo(fileName).Length + " bytes.");
}
}
}
using System;
using System.Collections;
using System.IO; namespace SEI.DL88250.SourceCodes.CSharp.QTL
{
/// <summary>查询系统类
/// </summary>
public class QTL
{
/// <summary>文本缓冲区
/// </summary>
internal static ArrayList textContentBuffer;
/// <summary>查询结果集,行号集合
/// </summary>
private ArrayList _queryResult;
/// <summary>表达式分析器
/// </summary>
private ExpressionAnalyser _ea;
/// <summary>构造器,初始化文本集
/// </summary>
public QTL()
{
textContentBuffer = new ArrayList();
textContentBuffer.Add(null); // 填掉第0个位置
_queryResult = new ArrayList();
}
/// <summary>清空查询结果
/// </summary>
public void ClearResults()
{
_queryResult.Clear();
}
/// <summary>清屏
/// </summary>
public void ClearScreen()
{
Console.ReadLine();
Console.Clear();
}
/// <summary>让用户输入查询字串,并开始分析
/// </summary>
public void UserInputQuery()
{
Console.Write("Please enter a query or 'q' to Quit: ");
string query = Console.ReadLine();
if ("q" == query)
{
Environment.Exit(0);
}
_ea = new ExpressionAnalyser(query);
}
/// <summary>根据用户输入的字串进行查询处理
/// </summary>
public void ProcessQuery()
{
ArrayList expression = _ea.ToPostfix(); // 后缀表达式集
#region 后缀表达式正确性验证显示测试
//IEnumerator ie = expression.GetEnumerator();
//while (ie.MoveNext())
//{
// Console.Write(((Expression)ie.Current).ExpressionString);
//}
//Console.WriteLine();
#endregion 正确性验证显示结束
Stack s = new Stack(); // 运算过程栈
Stack p = new Stack(); // 运算字串栈,用于分步打印
#region 基于后缀表达式进行查询运算与结果分步显示
for (int i = 0; i < expression.Count; i++)
{
Expression exp = (Expression)expression[i];
switch (exp.ExpressionType)
{
case "query":
{
s.Push(new UnitaryQuery(exp.ExpressionString));
#region 打印当前关键字运算的结果
string curExp = exp.ExpressionString;
p.Push((object)curExp);
PrintSetpResult(curExp, s);
#endregion 打印结束
break;
}
case "&&":
{
Query q1 = (Query)s.Pop();
Query q2 = (Query)s.Pop();
s.Push(new AndQuery(q1, q2));
#region 打印当前"&&"运算的结果
string curExp = "";
curExp += (string)p.Pop();
curExp += " && ";
curExp += (string)p.Pop();
p.Push((object)(curExp));
PrintSetpResult(curExp, s);
#endregion 打印结束
break;
}
case "||":
{
Query q1 = (Query)s.Pop();
Query q2 = (Query)s.Pop();
s.Push(new OrQuery(q1, q2));
#region 打印当前"||"运算的结果
string curExp = "";
curExp += (string)p.Pop();
curExp += " || ";
curExp += (string)p.Pop();
//curExp = curExp.Insert(curExp.Length, ")");
p.Push((object)(curExp));
PrintSetpResult(curExp, s);
#endregion 打印结束
break;
}
case "!":
{
Query q = (Query)s.Pop();
s.Push(new NotQuery(q));
#region 打印当前"!"运算的结果
string curExp = "!";
curExp += (string)p.Pop();
p.Push((object)(curExp));
PrintSetpResult(curExp, s);
#endregion 打印结束
break;
}
default:
Console.Error.WriteLine("Expression error!");
break;
}
}
#endregion 核心运算完毕
#region 将结果转换成整型行号数组
for (int i = 0; i < ((Query)s.Peek()).Solution.Count; i++)
{
_queryResult.Add(Convert.ToInt32(((Query)s.Peek()).Solution[i].ToString()));
}
#endregion
}
/// <summary>打印运算过程中的分步结果概要
/// </summary>
/// <param name="curExp">当前表达式字串</param>
/// <param name="s">表达式栈</param>
private void PrintSetpResult(string curExp, Stack s)
{
Console.WriteLine(curExp);
Console.Write(" " + ((Query)s.Peek()).Solution.Count + " line(s) math ");
for (int j = 0; j < ((Query)s.Peek()).Solution.Count; j++)
{
Console.Write(" [{0}] ", ((Query)s.Peek()).Solution[j]);
}
Console.WriteLine();
}
/// <summary>打印结果的详细情况
/// </summary>
public void PrintResultDetails()
{
IEnumerator e = _queryResult.GetEnumerator();
while (e.MoveNext())
{
Console.WriteLine("[{0}]: {1}",
e.Current.ToString(), textContentBuffer[Convert.ToInt32(e.Current.ToString())].ToString());
}
}
/// <summary>读取一个查询文本
/// </summary>
public void AddFile()
{
string fileName = "Test.txt";
StreamReader fReader = File.OpenText(fileName);
Console.WriteLine("Reading " + fileName + " -- please wait!");
string aLine = fReader.ReadLine();
for (int i = 1; null != aLine; i++)
{
textContentBuffer.Add((object)(aLine));
aLine = fReader.ReadLine();
}
Console.WriteLine("Reading " + fileName + " -- OK, done!");
Console.WriteLine("The text file " + new FileInfo(fileName).Name + ' '
+ " contains " + textContentBuffer.Count
+ " lines in " + new FileInfo(fileName).Length + " bytes.");
}
}
}