需要帮助启动C ++的解析代码生成器

时间:2017-01-24 03:35:45

标签: c++ parsing tree generator

所以我正在攻读我的CS学位,目前正在学习编程语言概念课程。第一个任务是创建一个程序,该程序生成随机语法正确但不必在语义上正确。在完成BNF克隆之后,这个任务就出现了。我甚至从未见过创建解析树或使用解析树的程序。我通过这项任务从0到4000,并且诚实地怀疑我的能力。我不是在寻找免费乘车,但只是一些帮助甚至启动该计划。我甚至不确定主程序看起来是什么样子或它是如何工作的。任何C ++解析程序的指南或参考都会很棒。或者c ++中解析器的一些示例源代码。

这是作业......

本练习的目的是为C ++编程的子集编写语法生成器 将“随机”C ++程序写入文件的语言。通过语法随机写这些 正确的程序,您将进一步发展您对语法之间差异的理解 和语义。

考虑以下一组定义C ++编程子集的产品 语言:

(prog):: =" int main(){(stat_list)返回0; }"

(stat_list):: =(stat)             | (stat_list)(stat)

(stat):: =(cmpd_stat)             | (if_stat)             | (iter_stat)             | (assgn_stat)             | (decl_stat)

上述仅有16项生产规则中的少数几项。

问题1.编写一个以C,C ++,C#,Java或Python(您的选择)开头的程序 root non-terminal并使用the生成一个随机的语法正确的C ++程序 上面定义的制作。您应该按照我们在课堂上看到的示例进行扩展 递归非终端,直到我们获得仅由终端令牌组成的句子。在里面 生产包含多个扩展(即右侧表达式)的情况, 你的程序应该随机选择一个(最好是基于非均匀加权) 哪些扩展更有可能发生在C ++中)。你的程序应该写随机C ++ 代码到输出文件。

我必须使用C ++进行分配,因为这是我将介绍类带到CS类之后的唯一语言。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

这里的关键是

  

你应该按照我们在课堂上看到的例子,我们递归地扩展非终端,直到我们只获得一个由终端令牌组成的句子。

你确实在课堂上看到了那些例子,对吗?如果没有,这里是一个使用语法的例子,用于基于英语的自然语言。我使用类似于你似乎使用的约定,其中终端(即实际输出)在引号("fox")内,而非终端(短语类型)的名称在括号中({ {1}})。如果你从未参加过英语语法课程,你可能想看一眼parts of speech list

规则

(noun phrase)

我遗漏了形容词,副词,单数/复数协议以及其他一些有趣的东西。但我们可以生成几句话。

我们从

开始
(sentence) ::= (noun phrase) (verb phrase)
(noun phrase) ::= (pronoun) | (determiner) (noun)
(verb phrase) ::= (intransitive verb) | (transitive verb) (noun phrase)

(determiner) ::= "a" | "the"
(pronoun)    ::= "I" | "you"
(noun)       ::= "bug" | "cloud"
(intransitive verb) ::= "thought" | "procrastinated"
(transitive verb)   ::= "followed" | "liked"

只能用

代替
(sentence)

有两种可能的(noun phrase) (verb phrase) 替换。硬币翻转是尾巴,所以我们替换(noun phrase)

(determiner) (noun)

有两种可能的(determiner) (noun) (verb phrase) 替换。硬币翻转再次尾巴,所以我们用“the”代替

(determiner)
好的,我要浓缩一下。在每一步,我们替换第一个剩余的非终端(带括号的名称,记住)。我们可以在两列中写出整个派生(这就是所谓的):我们到目前为止所做的,以及我们将要应用的替换(总是到第一个未扩展的非终端)。所以每一行都以前一行的替换结果开始:

"the" (noun) (verb phrase)

这是另一个:

(sentence)                                     | (sentence) ::= (noun phrase) (verb phrase)
(noun phrase) (verb phrase)                    | (noun phrase) ::= (determiner) (noun) 
(determiner) (noun) (verb phrase)              | (determiner) ::= "the"   
"the" (noun) (verb phrase)                     | (noun) ::= "cloud"       
"the" "cloud" (verb phrase)                    | (verb phrase) ::= (transitive verb) (noun phrase)
"the" "cloud" (transitive verb) (noun phrase)  | (transitive verb) ::= "followed" 
"the" "cloud" "followed" (noun phrase)         | (noun phrase) ::= (determiner) (noun)
"the" "cloud" "followed" (determiner) (noun)   | (determiner) ::= "the"   
"the" "cloud" "followed" "the" (noun)          | (noun) ::= "bug"
"the" "cloud" "followed" "the" "bug"

(大约有20行代码,唯一的数据结构是语法,字符串向量向量的映射,以及两个包含中间结果的字符串向量。)