所以我正在攻读我的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类之后的唯一语言。
非常感谢任何帮助。
答案 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行代码,唯一的数据结构是语法,字符串向量向量的映射,以及两个包含中间结果的字符串向量。)