Skip to content

T_Cyjb_Compilers_Parsers_Parser_2

CYJB edited this page Mar 23, 2024 · 7 revisions

Parser(T, TController) 类

提供构造语法分析器的功能。

继承层次

System.Object
  Cyjb.Compilers.Parsers.Parser(T, TController)
    Cyjb.Compilers.Parsers.Parser(T)
Namespace: Cyjb.Compilers.Parsers
Assembly: Cyjb.Compilers (in Cyjb.Compilers.dll) Version: 1.0.20+d347ea0351607fb282fdf60a5301f9cccb3ab27e

语法

C#

public class Parser<T, TController>
where T : struct, new()
where TController : new(), ParserController<T>

类型参数

 

T
词法单元标识符的类型,一般是一个枚举类型。
TController
语法分析控制器的类型。
  The Parser(T, TController) type exposes the following members.

构造函数

 

名称 说明
公共方法 Parser(T, TController) Initializes a new instance of the Parser(T, TController) class
  Back to Top

方法

 

名称 说明
公共方法 AddStart 将指定非终结符标标记为开始符号。
公共方法 DefineAssociativity 定义具有指定结合性的终结符集合,定义越晚优先级越高。
公共方法 DefineProduction 定义指定的产生式。
公共方法 Equals Determines whether the specified object is equal to the current object. (继承自 Object。)
受保护的方法 Finalize Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection. (继承自 Object。)
公共方法 GetData 返回语法分析器的数据。
公共方法 GetFactory 返回语法分析的工厂。
公共方法 GetHashCode Serves as the default hash function. (继承自 Object。)
公共方法 GetStateDescription 返回最近一次构造的词法分析器的状态描述信息。
公共方法 GetType Gets the Type of the current instance. (继承自 Object。)
受保护的方法 MemberwiseClone Creates a shallow copy of the current Object. (继承自 Object。)
公共方法 ToString Returns a string that represents the current object. (继承自 Object。)
  Back to Top

Remarks

泛型参数 T 一般是一个枚举类型,用于标识词法单元。 其中包含了所有终结符和非终结符的定义。关于语法分析的相关信息,请参考我的系列博文 《C# 语法分析器(一)语法分析介绍》

示例

下面简单的构造一个数学算式的语法分析器:

enum Calc { Id, Add, Sub, Mul, Div, Pow, LBrace, RBrace, E }
// 非终结符的定义。
Parser<Calc> parser = new();
// 定义产生式
parser.DefineProduction(Calc.E, Calc.Id).Action(c => c[0].Value);
parser.DefineProduction(Calc.E, Calc.E, Calc.Add, Calc.E)
    .Action(c => (double) c[0].Value! + (double) c[2].Value!);
parser.DefineProduction(Calc.E, Calc.E, Calc.Sub, Calc.E)
    .Action(c => (double) c[0].Value! - (double) c[2].Value!);
parser.DefineProduction(Calc.E, Calc.E, Calc.Mul, Calc.E)
    .Action(c => (double) c[0].Value! * (double) c[2].Value!);
parser.DefineProduction(Calc.E, Calc.E, Calc.Div, Calc.E)
    .Action(c => (double) c[0].Value! / (double) c[2].Value!);
parser.DefineProduction(Calc.E, Calc.E, Calc.Pow, Calc.E)
    .Action(c => Math.Pow((double) c[0].Value!, (double) c[2].Value!));
parser.DefineProduction(Calc.E, Calc.LBrace, Calc.E, Calc.RBrace)
    .Action(c => c[1].Value);
// 定义运算符优先级。
parser.DefineAssociativity(AssociativeType.Left, Calc.Add, Calc.Sub);
parser.DefineAssociativity(AssociativeType.Left, Calc.Mul, Calc.Div);
parser.DefineAssociativity(AssociativeType.Right, Calc.Pow);
parser.DefineAssociativity(AssociativeType.NonAssociate, Calc.Id);
IParserFactory<Calc> factory = parser.GetFactory();
// 解析词法单元序列。
ITokenizer<Calc> tokenizer = /* 创建词法分析器 */;
ITokenParser<Calc> parser = factory.CreateParser(tokenizer);
Console.WriteLine(parser.Parse().Value);
// 输出 166.0

参见

Reference

Cyjb.Compilers.Parsers 命名空间
Cyjb.Compilers.Parsers.ParserData(T)

Other Resources

《C# 语法分析器(一)语法分析介绍》
Clone this wiki locally