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

标签 c# parsing abstract-syntax-tree visitor-pattern

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

最佳答案

不幸的是,是的。如果您正在解析的语法是自定义语法而不是标准语法(其中已经存在用于解析源代码的编译器),则必须对它们进行标记化。

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

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

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

因此,我建议您从您拥有的语法的语法文档开始,然后开始编写您的解析器。

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

既然你的高级语法是

Expression ::= Identifier | IntegerValue | BooleanExpression

IdentifierIntegerValue 是源代码中的常量文字,因此您需要开始寻找 BooleanExpression

要查找 BooleanExpression,您需要查找 BooleanBinaryExpressionBooleanUnaryExpressionTrueExpression FalseExpression.

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

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

等等……

注意你的文法在句法上支持递归,看AndExpressionEqualsExpression的定义,它们指向回Expression

AndExpression ::= Expression '&&' Expression

EqualsExpression ::= Expression '==' Expression

你在 String Class 中得到了一堆方法在 .NET Framework 中帮助您检测和解析语法。

另一种选择是您可以寻找以 c# 为目标的解析器生成器。例如,参见 ANTLR

关于c# - 如何在 C# 中逐步解析表达式(最好是访问者模式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37877422/

相关文章:

c# - 使用什么对象来锁定来自单个 session 的线程(来自单个连接的用户)

python - 如何调试 `ast.literal_eval` 中的错误?

python - 将自定义公式转换为 python 函数

java - 是否可以静态区分完全限定名称和嵌套类类型?

c# - 在数据网格上显示数据库详细信息

c# - 为什么派生自 ControllerBase 与 Controller for ASP.NET Core Web API?

c# - 为什么是 ;;在局部变量声明之后允许,但在字段声明之后不允许?

android - android中的json like字符串解析

python - 在给定标签处将 XML 文件拆分为多个

java - 解析时何时解析别名?