我是C#的新手。我有一个关于解析字符串的问题。如果我有一个包含诸如PC: SWITCH_A == ON
或的字符串之类的圆顶线的文件PC: defined(SWITCH_B) && SWITCH_C == OFF
。这里所有的运算符(==,&&,已定义)都是字符串,所有的开关名称(SWITCH_A)及其值都是标识符(OFF)。我如何解析这类字符串?我是否首先需要标记化它们,然后将它们用换行符或空格分开,然后再创建一个抽象语法树来对其进行解析?我还需要首先将所有标识符存储在字典中吗?我不知道解析任何人都可以帮忙吗?一个例子告诉我如何做到这一点,应该包括哪些方法和类?谢谢。
不幸的是。如果要解析的语法是自定义的,而不是已经存在用于解析源代码的编译器的标准语法,则必须标记它们。
您可以利用Expression Trees。它们位于.NET Framework中,用于构建和评估动态语言。
要开始解析语法,您必须拥有一个语法文件,该文件描述每行中语法的所有可能情况。之后,您可以开始解析行并构建您的表达式树。
解析任何源代码通常一次执行一个字符,因为每个字符可能会更改正在解析的片段的整个语义。
因此,我建议您先从语法文档中获取所需的语法,然后再开始编写解析器。
确保您尝试解析的语法没有任何东西,因为这类项目往往容易出错且耗时
现在,由于您的高级语法是
表达式:: =标识符| 整数值| 布尔表达式
Identifier
并且IntegerValue
在源代码中是常量文字,因此您需要开始寻找BooleanExpression
。
为了找到一个BooleanExpression
你需要寻找要么BooleanBinaryExpression
,BooleanUnaryExpression
,TrueExpression
或FalseExpression
。
您可以BooleanBinaryExpression
通过查找&&
或==
运算符来检测一个,然后取左和右操作数。
要检测到a,BooleanUnaryExpression
您需要查找单词defined
,然后解析括号中的标识符。
等等...
请注意,您的语法支持语法中的递归,请查看AndExpression
or的定义EqualsExpression
,它们指向Expression
AndExpression :: =表达式'&&'表达式
EqualsExpression :: =表达式'=='表达式
.NET Framework的String类中有很多方法可以帮助您检测和解析语法。
另一种选择是,您可以寻找针对c#的解析器生成器。例如,请参阅ANTLR
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句