如何在C#中逐步解析表达式(最好是访问者模式)

用户名

我是C#的新手。我有一个关于解析字符串的问题。如果我有一个包含诸如PC: SWITCH_A == ON或的字符串之类的圆顶线的文件PC: defined(SWITCH_B) && SWITCH_C == OFF这里所有的运算符(==,&&,已定义)都是字符串,所有的开关名称(SWITCH_A)及其值都是标识符(OFF)。我如何解析这类字符串?我是否首先需要标记化它们,然后将它们用换行符或空格分开,然后再创建一个抽象语法树来对其进行解析?我还需要首先将所有标识符存储在字典中吗?我不知道解析任何人都可以帮忙吗?一个例子告诉我如何做到这一点,应该包括哪些方法和类?谢谢。

蒂莫西·加尼姆(Timothy Ghanem)

不幸的是。如果要解析的语法是自定义的,而不是已经存在用于解析源代码的编译器的标准语法,则必须标记它们。

您可以利用Expression Trees它们位于.NET Framework中,用于构建和评估动态语言。

要开始解析语法,您必须拥有一个语法文件,该文件描述每行中语法的所有可能情况。之后,您可以开始解析行并构建您的表达式树。

解析任何源代码通常一次执行一个字符,因为每个字符可能会更改正在解析的片段的整个语义。

因此,我建议您先从语法文档中获取所需的语法,然后再开始编写解析器。

确保您尝试解析的语法没有任何东西,因为这类项目往往容易出错且耗时

现在,由于您的高级语法是

表达式:: =标识符| 整数值| 布尔表达式

Identifier并且IntegerValue在源代码中是常量文字,因此您需要开始寻找BooleanExpression

为了找到一个BooleanExpression你需要寻找要么BooleanBinaryExpressionBooleanUnaryExpressionTrueExpressionFalseExpression

您可以BooleanBinaryExpression通过查找&&==运算符来检测一个,然后取左和右操作数。

要检测到a,BooleanUnaryExpression您需要查找单词defined,然后解析括号中的标识符。

等等...

请注意,您的语法支持语法中的递归,请查看AndExpressionor的定义EqualsExpression,它们指向Expression

AndExpression :: =表达式'&&'表达式

EqualsExpression :: =表达式'=='表达式

.NET FrameworkString类有很多方法可以帮助您检测和解析语法。

另一种选择是,您可以寻找针对c#的解析器生成器。例如,请参阅ANTLR

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C#中强制转换表达式

来自分类Dev

仅标题环境中C ++中的访问者模式

来自分类Dev

实体框架表达式树lambda访问者错误

来自分类Dev

AST访问者函数调用表达式无法正确识别函数调用

来自分类Dev

python中的访问者模式

来自分类Dev

PHP中的访问者模式

来自分类Dev

C#中的正则表达式模式问题

来自分类Dev

如何在C#中使用正则表达式解析OData $ filter?

来自分类Dev

使用表达式访问C#中的结构属性

来自分类Dev

在C#中解析数学表达式

来自分类Dev

如何在Matlab中解析符号表达式

来自分类Dev

如何在angularjs表达式中解析int

来自分类Dev

如何在C ++正则表达式中忽略标记之间的空格(自由间距模式)

来自分类Dev

如何在C ++正则表达式中忽略标记之间的空格(自由间距模式)

来自分类Dev

如何逐步执行lambda表达式

来自分类Dev

如何使正则表达式解析C#中的可选片段

来自分类Dev

如何解析 C 中的数学表达式

来自分类Dev

如何在C#中的表达式中获取孙子的值?

来自分类Dev

如何在带有访问者的lambda中调用std :: visit,访问者是按值捕获的函数对象

来自分类Dev

如何在调试器中逐步执行对表达式的求值,而无需为其创建脚本?

来自分类Dev

如何在C#中强制转换表达式树lambda?

来自分类Dev

如何在C#中通过表达式树构建集合过滤器

来自分类Dev

如何在C#中为过滤器数据编写通用表达式树

来自分类Dev

如何在C#中合并(或动态构建和组合)lambda表达式?

来自分类Dev

如何在C#中通过表达式构建动态查询

来自分类Dev

如何在C#中评估自定义括号表达式?

来自分类Dev

未定义变量时,lambda表达式如何在c#中工作

来自分类Dev

如何在C#中添加永远不会用于表达式树的参数?

来自分类Dev

如何在C#中为过滤器数据编写通用表达式树

Related 相关文章

  1. 1

    如何在C#中强制转换表达式

  2. 2

    仅标题环境中C ++中的访问者模式

  3. 3

    实体框架表达式树lambda访问者错误

  4. 4

    AST访问者函数调用表达式无法正确识别函数调用

  5. 5

    python中的访问者模式

  6. 6

    PHP中的访问者模式

  7. 7

    C#中的正则表达式模式问题

  8. 8

    如何在C#中使用正则表达式解析OData $ filter?

  9. 9

    使用表达式访问C#中的结构属性

  10. 10

    在C#中解析数学表达式

  11. 11

    如何在Matlab中解析符号表达式

  12. 12

    如何在angularjs表达式中解析int

  13. 13

    如何在C ++正则表达式中忽略标记之间的空格(自由间距模式)

  14. 14

    如何在C ++正则表达式中忽略标记之间的空格(自由间距模式)

  15. 15

    如何逐步执行lambda表达式

  16. 16

    如何使正则表达式解析C#中的可选片段

  17. 17

    如何解析 C 中的数学表达式

  18. 18

    如何在C#中的表达式中获取孙子的值?

  19. 19

    如何在带有访问者的lambda中调用std :: visit,访问者是按值捕获的函数对象

  20. 20

    如何在调试器中逐步执行对表达式的求值,而无需为其创建脚本?

  21. 21

    如何在C#中强制转换表达式树lambda?

  22. 22

    如何在C#中通过表达式树构建集合过滤器

  23. 23

    如何在C#中为过滤器数据编写通用表达式树

  24. 24

    如何在C#中合并(或动态构建和组合)lambda表达式?

  25. 25

    如何在C#中通过表达式构建动态查询

  26. 26

    如何在C#中评估自定义括号表达式?

  27. 27

    未定义变量时,lambda表达式如何在c#中工作

  28. 28

    如何在C#中添加永远不会用于表达式树的参数?

  29. 29

    如何在C#中为过滤器数据编写通用表达式树

热门标签

归档