使用左因子分解去除语法中隐藏的歧义

时间:2015-02-07 10:03:06

标签: parsing grammar context-free-grammar ambiguous-grammar

我正在尝试将语法缩减为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。

0 个答案:

没有答案