-
Notifications
You must be signed in to change notification settings - Fork 31
T_Cyjb_Compilers_Parsers_Parser_2
CYJB edited this page Jan 16, 2023
·
7 revisions
提供构造语法分析器的功能。
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.8
C#
public class Parser<T, TController>
where T : struct, new()
where TController : new(), ParserController<T>
- T
- 词法单元标识符的类型,一般是一个枚举类型。
- TController
- 语法分析控制器的类型。
名称 | 说明 | |
---|---|---|
Parser(T, TController) | Initializes a new instance of the Parser(T, TController) class |
名称 | 说明 | |
---|---|---|
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。) |
泛型参数 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
Cyjb.Compilers.Parsers 命名空间
Cyjb.Compilers.Parsers.ParserData(T)
-
CYJB 编译类库
- Cyjb.Compilers 命名空间
-
Cyjb.Compilers.Lexers 命名空间
- CharClass 类
- CharClassMap 类
- CharClassSet 类
- ContextData 类
- Dfa 类
- DfaData 类
- DfaState 类
- DfaStateData 类
- ILexerFactory(T) 接口
- ITerminalBuilder(T, TController) 接口
- Lexer(T) 类
-
Lexer(T, TController) 类
- Lexer(T, TController) 构造函数
- Lexer(T, TController) 属性
-
Lexer(T, TController) 方法
- Lexer(T, TController).DefineContext 方法
- Lexer(T, TController).DefineInclusiveContext 方法
- Lexer(T, TController).DefineRegex 方法
- Lexer(T, TController).DefineSymbol 方法
- Lexer(T, TController).GetCharClassDescription 方法
- Lexer(T, TController).GetData 方法
- Lexer(T, TController).GetFactory 方法
- Lexer(T, TController).GetStateDescription 方法
-
LexerController(T) 类
- LexerController(T) 构造函数
-
LexerController(T) 属性
- LexerController(T).ActionHandler 属性
- LexerController(T).Candidates 属性
- LexerController(T).Context 属性
- LexerController(T).InitialContext 属性
- LexerController(T).Kind 属性
- LexerController(T).SharedContext 属性
- LexerController(T).Source 属性
- LexerController(T).Span 属性
- LexerController(T).Start 属性
- LexerController(T).Text 属性
- LexerController(T).Value 属性
-
LexerController(T) 方法
- LexerController(T).Accept 方法
- LexerController(T).BeginContext 方法
- LexerController(T).CreateToken 方法
- LexerController(T).CreateTokenizeError 方法
- LexerController(T).Dispose 方法
- LexerController(T).EnterContext 方法
- LexerController(T).ExitContext 方法
- LexerController(T).More 方法
- LexerController(T).PopContext 方法
- LexerController(T).PushContext 方法
- LexerController(T).Reject 方法
- LexerController(T).SourceLoaded 方法
- LexerData(T) 类
- LexerFactory(T) 类
- LexerFactory(T, TController) 类
- LexerRunner(T) 类
- LexerTokenizer(T) 类
- Nfa 类
- NfaBuildResult 结构
- NfaState 类
- NfaStateType 枚举
- RejectOptions 枚举
- TerminalData(T) 类
- TrailingType 枚举
-
Cyjb.Compilers.Parsers 命名空间
- AssociativeType 枚举
- IParserFactory(T) 接口
- LRParser(T) 类
- ParseOptions 枚举
- Parser(T) 类
- Parser(T, TController) 类
- ParserAction 结构
- ParserActionType 枚举
-
ParserController(T) 类
- ParserController(T) 构造函数
- ParserController(T) 属性
-
ParserController(T) 方法
- ParserController(T).ConsumeTokens 方法
- ParserController(T).Dispose 方法
- ParserController(T).EmitParseError 方法
- ParserController(T).FilterTokens 方法
- ParserController(T).GetEnumerator 方法
- ParserController(T).GetItemAt 方法
- ParserController(T).GetNextState 方法
- ParserController(T).IndexOf 方法
- ParserController(T).PanicRecover 方法
- ParserController(T).Peek 方法
- ParserController(T).Read 方法
- ParserController(T).SyncState 方法
- ParserController(T).TokenizerLoaded 方法
- ParserController(T).TryRecover 方法
- ParserData 类
- ParserData(T) 类
- ParserFactory(T) 类
- ParserFactory(T, TController) 类
- ParserStateData(T) 类
- ProductionAction 类
- ProductionBuilder(T, TController) 类
- ProductionData(T) 类
- SymbolOptions 枚举
-
Cyjb.Compilers.RegularExpressions 命名空间
- AlternationExp 类
- AnchorExp 类
- CharClassExp 类
- ConcatenationExp 类
- EndOfFileExp 类
-
LexRegex 类
- LexRegex 构造函数
- LexRegex 属性
-
LexRegex 方法
- LexRegex.Alternate 方法
- LexRegex.AnyChar 方法
- LexRegex.BeginningOfLine 方法
- LexRegex.CheckRegex 方法
- LexRegex.Concat 方法
- LexRegex.EndOfLine 方法
- LexRegex.Equals 方法
- LexRegex.GetHashCode 方法
- LexRegex.Literal 方法
- LexRegex.LiteralIgnoreCase 方法
- LexRegex.Optional 方法
- LexRegex.Parse 方法
- LexRegex.Positive 方法
- LexRegex.Repeat 方法
- LexRegex.RepeatMaxTimes 方法
- LexRegex.RepeatMinTimes 方法
- LexRegex.Star 方法
- LexRegex.Symbol 方法
- LexRegex.SymbolIgnoreCase 方法
- LexRegex.ToString 方法
- LexRegex.Trailing 方法
- LexRegex 运算符
- LexRegex 字段
- LiteralExp 类
- QuantifierExp 类
- RegexCharClass 类
-
Cyjb.Text 命名空间
- EnumerableTokenizer(T) 类
- ITokenizer(T) 接口
- ITokenParser(T) 接口
- MissingTokenError(T) 类
- ParserNode(T) 类
- ParseStatus 枚举
- SourceMark 类
-
SourceReader 类
- SourceReader 构造函数
- SourceReader 属性
-
SourceReader 方法
- SourceReader.Accept 方法
- SourceReader.AcceptToken(T) 方法
- SourceReader.Close 方法
- SourceReader.Dispose 方法
- SourceReader.Drop 方法
- SourceReader.GetLinePositionSpan 方法
- SourceReader.GetPosition 方法
- SourceReader.GetReadedText 方法
- SourceReader.Mark 方法
- SourceReader.Peek 方法
- SourceReader.Read 方法
- SourceReader.ReadBlock 方法
- SourceReader.Release 方法
- SourceReader.Unget 方法
- SourceReader.UseLineLocator 方法
- SourceReader 字段
- Token(T) 类
- TokenCollection(T) 类
- TokenDisplayNameAttribute 类
- TokenizeError 类
- TokenizeErrorHandler(T) 委托
- TokenParseError 类
- TokenParseErrorHandler(T) 委托
- UnexpectedTokenError(T) 类