我遇到了一个旧的多项选择问题:
当我们使用LL(1)解析时,未发生以下哪一项...假设输入是否正确,以$结尾。
E -> FT$
T -> *FT | epsilon
F -> id | (E)
a) a symbol on the top of stack is not the same with input symbol.
b) the stack is empty, but input is remaining.
c) the input is finished, but stack is not empty.
d) the parse table in non terminal on the top of stack and terminal of input be empty.
答案表说(2)是正确的。任何描述或教程?
答案 0 :(得分:0)
你需要刷英语,这样才有意义(真的!!!!)并且是自我一致的,但我可以猜测一下这意味着什么。如果我在所有情况下都不正确的话,请原谅我。
现在,我从未通过显式堆栈进行LL解析(对我来说,它只是在一个合理的实现中为每个非终端调用一个子例程),但是你拥有的东西肯定可以通过1令牌前瞻来解决,所以我想我可以基于LL解析我的方式而忽略你的“LL(1)”中的“(1)”只是告诉我你愿意回溯多远(答案:根本没有,给定下一个符号)。
首先,你的问题是小溪,因为如果我给这个解析器!(%*(%% ^%作为输入,它会直接失败,这会留下很多在它开始之前输入“剩余”,所以我假设如果你的实现有一个堆栈它开始为空,保持为空,结束为空,而输入全部未被使用。这与“b)”相矛盾(不是“(2)” !!!!!请轻松搞定 - 我们怎么能相信你?)。
我知道你的“a)”是什么意思,因为你没有告诉我你是如何实现这个解析器的。在没有描述它的情况下向我询问有关您的特定实现的事情毫无意义。你按照自己的方式行事,我按照自己的方式行事。你不妨问我袜子在哪里......我不知道!但是,我认为堆栈中填充了输入符号。我不知道他们会发生什么,但我不得不假设他们在堆栈顶部(你的意思是“底部”?这就是通常把新东西放在堆栈中的地方!)而顶部将等于当只有一个符号在堆栈中时。它没有被拒绝,所以它是一个“(”或“标识符”[请把它变成你的标记是什么!我猜这个“id”是一个标记类缩写,而“(”是一个文字)在设置问题时请小心谨慎: - (]。
此时的输入取决于您如何实施以及如何谈论它们。我假设一个输入符号没有复制到堆栈上,而是转移到它上面,从输入流中删除它,并且你的循环中没有任何一点符号在输入中同时被移动或复制到堆栈中在同一时间。
此外,在我看来,把东西放在堆栈上的唯一原因是它是否是“(”,因为你还不知道是否拒绝它。如果它是一个“标识符”,你就会吃掉它,按规则1进行2进行3 [在你的语法规则中做什么“*”!请删除,除非它意味着你不说的东西]。
然后任何人都可以在输入时放置他们喜欢的任何符号。如果它不是标识符或“(”,那么它会被拒绝吗?[请澄清你是否在谈论接受的输入!]。所以“a)”是矛盾的。即使下一个符号被接受,也不会将其限制为“(”再次,所以“a”)仍然是矛盾的。
关于“c)”,是的,很容易实现。只需输入“x(”。“x”将作为标识符使用,“(”将进入堆栈,但是没有更多的输入,这里没有“$”或其他什么来犯规事情或结束它们[如果“$”表示输入结束或者它是符号,请澄清!]。
但是,如果“$”确实意味着输入的结束,那么我看不到在那个时候在堆栈上有东西的方法。您的有效输入是x或xx或x(x)或x(xx)或xx(x)或xxx(x(xx))等。如果看到输入结束时堆栈不为空,那将是一个错误条件[如果您正在谈论所有可能的输入或只是接受的输入,请澄清!]。
你的“d)”让我对英语的意思更加难以理解。请修复它[和其他注意到的东西,这里没有注明!]。
[阅读这个问题的每个人都会注意到,只有在不能进行课堂练习或以前的课程练习的情况下,才能将错误的副本放在全球网站上而不理解该问题需要知道已经向班级讲授了什么实施和语言,并仔细定义了错误响应和观察时间。这有点让我气馁。]