如何在 C# 中逐步解析表达式(最好是访问者模式)
how to parse an expression step by step in c# (preferably 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
Identifier
和 IntegerValue
是源代码中的常量文字,因此您需要开始寻找 BooleanExpression
.
要查找 BooleanExpression
,您需要查找 BooleanBinaryExpression
、BooleanUnaryExpression
、TrueExpression
或 FalseExpression
。
您可以通过查找 &&
或 ==
运算符然后获取左右操作数来检测 BooleanBinaryExpression
。
要检测 BooleanUnaryExpression
,您需要查找单词 defined
,然后解析括号中的标识符。
等等...
注意你的文法在语法中支持递归,看AndExpression
或EqualsExpression
的定义,它们指向Expression
AndExpression ::= Expression '&&' Expression
EqualsExpression ::= Expression '==' Expression
您在 .NET Framework String Class 中获得了很多方法来帮助您检测和解析您的语法。
另一种选择是您可以寻找以 c# 为目标的解析器生成器。例如,参见 ANTLR
我是 c# 新手。我有一个关于解析字符串的问题。如果我有一个文件,其中包含 PC: SWITCH_A == ON
等圆顶线或 PC: defined(SWITCH_B) && SWITCH_C == OFF
等字符串。所有运算符(==、&&、已定义)在这里都是字符串,所有开关名称(SWITCH_A)及其值都是标识符(OFF)。我如何解析这些字符串?我是否首先必须将它们标记化,用新行或空格将它们分开,然后制作一个抽象语法树来解析它们?我还需要先将所有标识符存储在字典中吗?我不知道解析有人能帮忙吗?举个例子告诉我该怎么做,应该包括哪些方法和 类?谢谢
不幸的是,是的。如果您正在解析的语法是自定义语法而不是已经存在用于解析源代码的编译器的标准语法,则必须对它们进行标记化。
您可以利用 Expression Trees。它们存在于 .NET Framework 中,用于构建和评估动态语言。
要开始解析语法,您必须有一个语法文档,在每一行中描述语法的所有可能情况。之后,您可以开始解析行并构建表达式树。
解析任何源代码通常一次解析一个字符,因为每个字符都可能改变正在解析的片段的整个语义。
所以,我建议您从一个语法文档开始,了解您所拥有的语法,然后开始编写您的解析器。
确保您尝试解析的语法没有任何现成的东西,因为这类项目往往容易出错且耗时
既然你的高级语法是
Expression ::= Identifier | IntegerValue | BooleanExpression
Identifier
和 IntegerValue
是源代码中的常量文字,因此您需要开始寻找 BooleanExpression
.
要查找 BooleanExpression
,您需要查找 BooleanBinaryExpression
、BooleanUnaryExpression
、TrueExpression
或 FalseExpression
。
您可以通过查找 &&
或 ==
运算符然后获取左右操作数来检测 BooleanBinaryExpression
。
要检测 BooleanUnaryExpression
,您需要查找单词 defined
,然后解析括号中的标识符。
等等...
注意你的文法在语法中支持递归,看AndExpression
或EqualsExpression
的定义,它们指向Expression
AndExpression ::= Expression '&&' Expression
EqualsExpression ::= Expression '==' Expression
您在 .NET Framework String Class 中获得了很多方法来帮助您检测和解析您的语法。
另一种选择是您可以寻找以 c# 为目标的解析器生成器。例如,参见 ANTLR