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

时间:2016-06-17 09:05:16

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

解析任何源代码通常会一次出现一个字符,因为每个字符可能会更改正在解析的部分的整个语义。

所以,我建议您先从语法文档开始,然后再开始编写解析器。

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

现在你的高级语法是

  

Expression :: = Identifier | IntegerValue | BooleanExpression

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

要查找BooleanExpression,您需要查找BooleanBinaryExpressionBooleanUnaryExpressionTrueExpressionFalseExpression

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

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

等等......

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

  

AndExpression :: = Expression'&&'表达

     

EqualsExpression :: = Expression'=='Expression

.NET Framework中的String Class中有很多方法可以帮助您检测和解析语法。

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