Skip to content

T_Cyjb_Compilers_Lexers_Lexer_1

CYJB edited this page Mar 23, 2024 · 8 revisions

Lexer(T) 类

表示词法分析规则。

继承层次

System.Object
  Cyjb.Compilers.Lexers.Lexer(T, LexerController(T))
    Cyjb.Compilers.Lexers.Lexer(T)
Namespace: Cyjb.Compilers.Lexers
Assembly: Cyjb.Compilers (in Cyjb.Compilers.dll) Version: 1.0.20+d347ea0351607fb282fdf60a5301f9cccb3ab27e

语法

C#

public sealed class Lexer<T> : Lexer<T, LexerController<T>>
where T : struct, new()

类型参数

 

T
词法单元标识符的类型,一般是一个枚举类型。
  The Lexer(T) type exposes the following members.

构造函数

 

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

属性

 

名称 说明
公共属性 Contexts 获取词法分析器上下文列表。 (继承自 Lexer(T, TController)。)
公共属性 TerminalMerge 获取终结符的合并信息。 (继承自 Lexer(T, TController)。)
  Back to Top

方法

 

名称 说明
公共方法 DefineContext 定义一个新的词法分析器的上下文。 (继承自 Lexer(T, TController)。)
公共方法 DefineInclusiveContext 定义一个新的词法分析器的包含型上下文。 (继承自 Lexer(T, TController)。)
公共方法 DefineRegex 定义一个指定名称的正则表达式。 (继承自 Lexer(T, TController)。)
公共方法 DefineSymbol 定义使用指定正则表达式的终结符。 (继承自 Lexer(T, TController)。)
公共方法 Equals Determines whether the specified object is equal to the current object. (继承自 Object。)
公共方法 GetCharClassDescription 返回最近一次构造的 DFA 的字符类描述信息。 (继承自 Lexer(T, TController)。)
公共方法 GetData 返回词法分析的数据。 (继承自 Lexer(T, TController)。)
公共方法 GetFactory 返回词法分析的工厂。 (继承自 Lexer(T, TController)。)
公共方法 GetHashCode Serves as the default hash function. (继承自 Object。)
公共方法 GetStateDescription 返回最近一次构造的 DFA 的状态描述信息。 (继承自 Lexer(T, TController)。)
公共方法 GetType Gets the Type of the current instance. (继承自 Object。)
公共方法 ToString Returns a string that represents the current object. (继承自 Object。)
  Back to Top

Remarks

泛型参数 T 一般是一个枚举类型,用于标识词法单元。

对于词法分析中的冲突,总是选择最长的词素。如果最长的词素可以与多个模式匹配, 则选择最先被定义的模式。关于词法分析的相关信息,请参考我的系列博文 《C# 词法分析器(一)词法分析介绍》,词法分析器的使用指南请参见 《C# 词法分析器(七)总结》

示例

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

enum Calc { Id, Add, Sub, Mul, Div, Pow, LBrace, RBrace }
Lexer<Calc> lexer = new Lexer<Calc>();
// 终结符的定义。
lexer.DefineSymbol("[0-9]+").Kind(Calc.Id).Action(c => c.Accept(int.Parse(c.Text)));
lexer.DefineSymbol("\\+").Kind(Calc.Add);
lexer.DefineSymbol("\\-").Kind(Calc.Sub);
lexer.DefineSymbol("\\*").Kind(Calc.Mul);
lexer.DefineSymbol("\\/").Kind(Calc.Div);
lexer.DefineSymbol("\\^").Kind(Calc.Pow);
lexer.DefineSymbol("\\(").Kind(Calc.LBrace);
lexer.DefineSymbol("\\)").Kind(Calc.RBrace);
// 吃掉所有空白。
lexer.DefineSymbol("\\s");
ILexerFactory<Calc> lexerFactory = lexer.GetFactory();
// 要分析的源文件。
string source = "1 + 20 * 3 / 4*(5+6)";
ITokenizer<Calc> tokenizer = lexerFactory.CreateTokenizer(source);
// 构造词法分析器。
foreach (Token<Calc> token in tokenizer)
{
    Console.WriteLine(token);
}

参见

Reference

Cyjb.Compilers.Lexers 命名空间

Other Resources

《C# 词法分析器(一)词法分析介绍》
《C# 词法分析器(七)总结》
Clone this wiki locally