繁体   English   中英

如何在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的字符串PC: SWITCH_A == ON PC: defined(SWITCH_B) && SWITCH_C == OFF 这里所有的运算符(==,&&,已定义)都是字符串,所有的开关名称(SWITCH_A)及其值都是标识符(OFF)。 我如何解析这类字符串? 我是否首先需要标记化它们,然后将它们用换行符或空格分隔,然后再创建一个抽象语法树来解析它们? 我还需要首先将所有标识符存储在字典中吗? 我不知道解析任何人都可以帮忙吗? 一个例子告诉我该怎么做,应该包括哪些方法和类? 谢谢。

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

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

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

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

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

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

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

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

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

要查找BooleanExpression您需要查找BooleanBinaryExpressionBooleanUnaryExpressionTrueExpressionFalseExpression

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

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

等等...

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM