0

我正在尝试将我们创建的假设语言的语法简化为 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>  

我对其进行了更多研究,发现歧义在“楼层”和“统计”之间。FIRST('stats') 和 FIRST('floors'),即第一个终端字符的集合都包含“id”和“}”。

我可以看到为什么这会是一个问题,以及左分解如何解决这个问题。但是我怎样才能通过左分解来消除这种歧义呢?

注意:这里,'id' 表示标识符。

'#' 表示 epsilon。

4

0 回答 0