C# 微型语法分析器生成器的语法转换

C# 微型语法分析器生成器的语法转换,c#,parsing,grammar,parser-generator,C#,Parsing,Grammar,Parser Generator,为了让我为实习做好准备,我决定尝试学习更多关于语法和语法分析器的知识。我想做一个简单的编译器,并决定了这样一个语法。终端是小写的 P -> S P | epsilon S -> id assign E semi | print id semi E -> T E' E'-> + T E' | - T E' | epsilon T -> F T' T' -> * F T' | / F T' | epsilon F -> X F' F' -> **X F

为了让我为实习做好准备,我决定尝试学习更多关于语法和语法分析器的知识。我想做一个简单的编译器,并决定了这样一个语法。终端是小写的

P -> S P | epsilon
S -> id assign E semi | print id semi
E -> T E'
E'-> + T E' | - T E' | epsilon
T -> F T'
T' -> * F T' | / F T' | epsilon
F -> X F'
F' -> **X F' | epsilon
X -> (E) | identifier | number
gramamr将允许这样的代码。行动将被分配

报表(=)

加法(-)

乘法(*)

分部(/)

减法(-)

求幂(**)

语句序列

和打印语句(print)。此外,论文也将包括在内

xabc = 3.141592 ; 
y = -2.0 ; 
z = xabc * y - 1 ; 
print z ;
我打开了codeproject.com上一个名为Tiny Parser Generator的程序。这里是链接

这里给出了一个简单的例子,它允许我理解整数的基本数学函数。我只是希望有人能给我一些关于如何使用这个生成器的见解,尝试将我的语法转换成一个与生成器一起工作的语法,特别是与变量、赋值语句(即=)一起工作,并允许编写多行代码。任何帮助都将不胜感激,谢谢

编辑-谢谢你的评论。我意识到在我的问题措辞上产生的混乱。我想做的第一个任务是在我链接的网站工具提供的simple expression 2语法中添加变量和赋值语句的功能,例如
x=5

这似乎是一篇有着潜在有趣答案的合理帖子,但你能改进最后问题的措辞吗?请看:这是一个有点宽泛的问题。找到一个简单的语法分析器生成器教程,并完成它。不管是哪个解析器生成器。我发现它们都让我感到痛苦,所以教程本身的质量是关键。“允许编写多行代码”——我想知道我是否误解了问题的这一部分;通常,解析器(语法部分)使用来自使用文本的“词法分析器”或“词法分析器”的令牌流。因此,lexer看到“varx=\n9;”,并产生类似于
[{“ident”:“var”},{“ident”:“x”},{“op”:“=”},{“num”:9}]
的结果。lexer在运行时会吃掉并丢弃空格,除非该语言(如JavaScript)出于某种(总是不好的)原因希望将换行符视为有意义的。Ok。谢谢你的评论。我想完成的第一个任务是添加一个带有变量的赋值语句。所以我可以有一条线,表示x=5;我想那对我来说是一个很好的开始。我在大学里为一个编译器课程做了类似的事情。(我写了我自己的生成器,但这与这里无关。)它是。。。不愉快的我发现生成的解析器庞大且难以使用。解析错误质量很低,因为它没有上下文(不要低估这一点)。作为一个从那时起就手工编写了一些递归下降解析器的人,我发现它们更简单、更优雅,并且产生更好的错误和更好的AST来引导。我在工作场所见过许多手写的解析器,但只有一个生成了一个(用于工具的一个模糊的副功能)。这似乎是一篇合理的帖子,有可能会有有趣的答案,但你能改进最后问题的措辞吗?请看:这是一个有点宽泛的问题。找到一个简单的语法分析器生成器教程,并完成它。不管是哪个解析器生成器。我发现它们都让我感到痛苦,所以教程本身的质量是关键。“允许编写多行代码”——我想知道我是否误解了问题的这一部分;通常,解析器(语法部分)使用来自使用文本的“词法分析器”或“词法分析器”的令牌流。因此,lexer看到“varx=\n9;”,并产生类似于
[{“ident”:“var”},{“ident”:“x”},{“op”:“=”},{“num”:9}]
的结果。lexer在运行时会吃掉并丢弃空格,除非该语言(如JavaScript)出于某种(总是不好的)原因希望将换行符视为有意义的。Ok。谢谢你的评论。我想完成的第一个任务是添加一个带有变量的赋值语句。所以我可以有一条线,表示x=5;我想那对我来说是一个很好的开始。我在大学里为一个编译器课程做了类似的事情。(我写了我自己的生成器,但这与这里无关。)它是。。。不愉快的我发现生成的解析器庞大且难以使用。解析错误质量很低,因为它没有上下文(不要低估这一点)。作为一个从那时起就手工编写了一些递归下降解析器的人,我发现它们更简单、更优雅,并且产生更好的错误和更好的AST来引导。我在工作场所见过许多手写的解析器,但只有一个生成了一个(用于工具的一个模糊的方面)。