返回顶部
首页 > 资讯 > 精选 >C# Parsing Library是什么意思
  • 838
分享到

C# Parsing Library是什么意思

2023-06-17 22:06:13 838人浏览 安东尼
摘要

小编给大家分享一下C# Parsing Library是什么意思,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!C# Parsing Library 是一个LL解析

小编给大家分享一下C# Parsing Library是什么意思,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

C# Parsing Library 是一个LL解析器产生框架,可以在C#中模拟ENBF文法定义。设计思路来自于Boost.Spirit,一个c++解析器框架。

一)C# Parsing Library:Parser 基本概念

a) 文法定义举例:P ::= a b    C#用法:P = a + b    序列

b) 文法定义举例:P ::= a | b  C#用法:P = a | b    选择

c) 文法定义举例:P ::= a *    C#用法:P = a.Star   0..n次匹配

d) 文法定义举例:P ::= a +    C#用法:P = a.Plus   1..n次匹配

e) 文法定义举例:P ::= a ?    C#用法:P = a.Opt    0..1次匹配

P为Parser类型,是解析器的抽象基类,它定义了一个抽象的Parse方法:

bool Parse(Scanner scanner);

Scanner类主要存储一个字符串输入,及一个光标位置,光标随着解析的进行向前移动。

例子:一个整数解析器, 定义为一个可选的符号后面跟若干数字:

Parser signed = (Parser.Lit('+') | '-').Opt;  Parser p = (signed + Parser.DigitChar.Plus).Lexeme;  bool success = p.Parse(new Scanner("-123"));

其中,Lit表示常量,Lexeme表示为词法分析,即不忽略空格。

二)C# Parsing Library:ParserRef

一个常用的四则运算表达式文法:

group      ::= '(' expression ')' factor     ::= integer | group  term       ::= factor (('*' factor) | ('/' factor))*  expression ::= term (('+' term) | ('-' term))*

用下面的方法是错误的:

Parser group; //  Parser 是抽象类,无法 new  Parser factor;  factor = Parser.Int | group; // 错误! group没有初始化!

但是使用ParserRef 就可以了:

ParserRef group = new ParserRef();  ParserRef factor = new ParserRef();  factor.Parser = Parser.Int | group;

完整的定义如下:

ParserRef group = new ParserRef();  ParserRef factor = new ParserRef();  ParserRef term = new ParserRef();  ParserRef expression = new ParserRef();    group.Parser = '(' + expression + ')';   factor.Parser = Parser.Int                | group;   term.Parser     = factor +                     ( ('*' + factor)                    | ('/' + factor)                    ).Star;   expression.Parser = term +                       ( ('+' + term)                      | ('-' + term)                      ).Star;

三)C# Parsing Library:Rule和语义支持

和 spirit一样,通过对[]的重载,实现对语义的支持。一般的parser的Action类型为Action< string>, 即 void Action(string s)。s为该parser匹配的内容。如果要支持上下文, 就要使用Rule了. Rule带有一个模板参数T,表示属性类型。Action类型为Func< T,T,T> 即 T Action(T lhs, T rhs)。对于以下的简单规则:      

LeftRule := RightRule [ Action(lhs, rhs) ]

其语义为:LeftRule.Attribute = Action(LeftRule.Attribute, RightRule.Attribute).

上面的四则运算示例可修改如下:

Grammar< int> grammar  = new Grammar< int>();  Rule< int> group = new Rule< int>(grammar);  Rule< int> factor = new Rule< int>(grammar);  Rule< int> term = new Rule< int>(grammar);  Rule< int> expression  = new Rule< int>(grammar);  Rule< int> start = new Rule< int>(grammar);  grammar.Start = start;   group.Parser = '(' + expression [ (lhs, rhs) => rhs ] + ')';   factor.Parser = Parser.IntValue [ v => grammar.Ret(v) ]  // (#1)                | group [ (lhs, rhs) => rhs ];   term.Parser = factor [ (lhs, rhs) => rhs ] +                 ( ('*' + factor [ (lhs, rhs) => lhs * rhs ])                | ('/' + factor [ (lhs, rhs) => lhs / rhs ])                ).Star;   expression.Parser = term [ (lhs, rhs) => rhs ] +                       ( ('+' + term [ (lhs, rhs) => lhs + rhs ])                      | ('-' + term [ (lhs, rhs) => lhs - rhs ])                      ).Star;    start.Parser = expression [ (lhs, rhs) => rhs ] + Parser.End;    int result;  bool success = grammar.Parse("10 + 20 + 30 * (40 + 50)", out result);  if (success) Console.WriteLine(result);

说明:

对于一般的Parser,语义动作中并不能有返回值,因为它不知道属性的确切类型,要支持属性,必须使用 Grammar.Ret().

在我自己实现以前,大致搜了一下,在CodeProject上有一个类似的实现,也是模仿Boost.Spirit,不过它的语义处理采用C#的事件机制,用起来极不方便。

以上是“C# Parsing Library是什么意思”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: C# Parsing Library是什么意思

本文链接: https://lsjlt.com/news/293918.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C# Parsing Library是什么意思
    小编给大家分享一下C# Parsing Library是什么意思,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!C# Parsing Library 是一个LL解析...
    99+
    2023-06-17
  • c#是什么意思
    c#是一种通用的面向对象编程语言,由微软公司开发并推出。它是在.NET框架上运行的一种编程语言,可以用于开发各种类型的应用程序,包括桌面应用、Web应用、移动应用和游戏等。C#还提供了许多高级特性,如委托、事件、属性和泛型等,使得开发者可以...
    99+
    2023-08-08
  • c#中??是什么意思
    c#中的操作符(空合并操作符)为null操作数提供备用值:检查操作数x是否为null。如果x不为null,返回x的值。如果x为null,返回备用值表达式y。 C# 中的 操作符 C#...
    99+
    2024-05-10
    c# 代码可读性
  • c#中+=是什么意思
    c# 中的+=运算符用于将一个值添加到现有的变量或属性中。它等同于将值赋给该变量或属性,然后再添加一个值。此运算符适用于数值类型,用于逐个更新值、累加或简化代码。 C#中的+=运算符 ...
    99+
    2024-05-10
    c#
  • c#中//是什么意思
    在 c# 中,// 表示单行注释,用于添加不影响代码运行的附加信息。语法为:// 注释内容。不同于多行注释 (/ 多行注释内容 /),单行注释只适用于一行,并提供有关代码片段、变量、方法...
    99+
    2024-05-10
    c#
  • c++中|是什么意思
    按位或(|)运算符将二进制数字的每一位进行或运算:如果两者的某一位都是 1,则结果中该位为 1;如果两者的某一位有一个是 0,则结果中该位为 0。它用于:提取位设置位清除位测试位 C+...
    99+
    2024-04-26
    c++
  • c++中/*是什么意思
    在 c++ 中,“/”和“/”是多行注释符号,用于注释掉代码块,使其不会被编译器执行。具体用法包括: 标记注释的结束。注释的内容可以是多行文本,无需以分号 (;) 结尾。 C++ 中 ...
    99+
    2024-04-26
    c++
  • c++中*=是什么意思
    = 运算符用于将变量乘以另一个值并存储在该变量中,等价于 variable = variable expression。语法:variable = expression。优点:简洁,提...
    99+
    2024-04-26
    c++
  • c++中' '是什么意思
    bloc++k||||||||block C++ 中的 '' 是什么? C++ 中的 '' 表示空字符。 具体解释: 空字符是一个没有打印效果的字符,它在 C++ 中用一对单引号表示。...
    99+
    2024-04-26
    c++ 格式化输出 字符串数组
  • c++中!=是什么意思
    c++ 中的 != 是一个二元运算符,表示 "不等于"。它用于比较两个表达式是否不相等,不同则返回 true,否则返回 false。语法为 expression1 != expressi...
    99+
    2024-04-26
    c++
  • c++中+=是什么意思
    c++ 中 += 运算符是复合赋值运算符,用于将一个值加到现有变量上,语法为 variable += expression,其等价赋值形式为 variable = variable + ...
    99+
    2024-04-26
    c++
  • c++中//是什么意思
    bloc++k||||||||block C++ 中的 // 在 C++ 中,"//" 符号表示单行注释的开始,而该行的剩余部分则被视为注释。注释不会被编译器处理,并且仅用于为代码提供...
    99+
    2024-04-26
    c++
  • c++中||是什么意思
    || 是 c++ 中的逻辑 or 运算符,用于连接两个布尔值。它计算结果:bool_expression1 为 true 则为 true,bool_expression1 为 false...
    99+
    2024-04-26
    c++
  • c++中→是什么意思
    c++ 中的箭头运算符(->)用于访问对象成员,它将一个指针和一个成员名称结合起来,以访问该成员,等价于点运算符 (.),但要求对象必须通过指针访问。 C++ 中的箭头运算符 (...
    99+
    2024-04-28
    c++
  • c++中$是什么意思
    在 c++ 中,$ 符号用于:字符串化宏:将宏参数转换为字符串形式,格式为 #define str(x) #xstr(hello),结果为 "hello" 字符串常量。异常处理:在 ca...
    99+
    2024-04-28
    c++ 字符串常量
  • c++中%是什么意思
    c++ 中 % 表示取模运算,它计算两个整数之间的余数,语法为 result = a % b,其中 a 和 b 为整数,result 为 a 除以 b 时的余数。此外,百分号还用于流格式...
    99+
    2024-04-26
    c++
  • c++中==是什么意思
    在 c++ 中,== 运算符用于比较两个表达式的值是否相等,如果相等则返回 true,否则返回 false。它支持不同数据类型的比较,并会进行自动类型转换以方便比较。但要注意不要与赋值运...
    99+
    2024-05-01
    c++ 隐式转换
  • C#多态是什么意思
    本篇内容介绍了“C#多态是什么意思”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是C#多态?面向对象程序设计中的另外一个重要概念是多...
    99+
    2023-06-17
  • c语言@是什么意思
    c 语言中 @ 符号的含义包括:指向变量地址、格式化字符串、指定属性、预处理器指令、gcc 扩展(如打印文件名、行号和函数名)。 C 语言中 @ 的含义 C 语言中的 @ 符号具有多种...
    99+
    2024-04-13
    c语言 格式化输出
  • c语言→是什么意思
    c语言是一种高级通用编程语言,以简洁性、效率和可移植性而闻名。其特点包括:结构化编程:支持 if-else 语句、循环和函数。高效性:编译成机器代码,运行速度快。可移植性:遵循 ansi...
    99+
    2024-04-13
    linux c语言 c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作