我正在尝试将语法缩减为LL(1)以获得我们创建的假设语言。我已经删除了语法中的大部分左因子分解问题,使用了为其引入新的非终端字符的一般规则。
例如,
<assignmentstats>------- <type><id>=<E>/ id=<E>/id'['<E>']'=<E>/
转换为
<assignmentstats>------- <type><id>=<E>/ id<LF3>
<LF3>------- =<E>/[<E>]=<E>
对所有必需的陈述应用这些规则后,我期待一种明确的语法。
但是下面的陈述在某种程度上仍然含糊不清。
<body>------- <forrelatedstuff>/ <floors>/<stats>
以下是语法的相关陈述(仅显示了所需的语法)
<funcbody>----- {<stats>}
<stats>----- <stat> <stats>/ #
<floors>-------- <floor><floors>/ #
<floor>------- floo <id><arr>{stats}/id<arr>{<stats>}
<stat>----- <superstats>/<returnstats>
<superstats>----- <type>id<Zip>/id<LF3>
<building> ------- build <id> {<body>}
<returnstats>--------- return <E>
我更加注重它,并发现模糊性在地板之间&#39;和&#39;统计&#39;。 FIRST(&#39; stats&#39;)和FIRST(&#39; floor&#39;),即第一个终端字符集包含&#39; id&#39;和&#39;}&#39;对于两者。
我可以看出为什么这会是一个问题以及左派保理如何解决这个问题。但是如何通过左因子分解来消除这种歧义呢?
注意:这里, &#39; ID&#39;表示标识符。
&#39;#&#39;表示epsilon。