【问题标题】:Make the Grammar LL制作语法 LL
【发布时间】:2014-03-11 00:55:18
【问题描述】:

我已经在转换它上浪费了两个时间,但我总是起床获得通用前缀 ID。

谁能给我解释一下?因为我正在尝试为一个非常大的语法做这件事,并且需要清楚我的基础知识。

A、B、C、D 是唯一的非终端。

A : ‘(‘ B ‘)’ 
 | ID ASSIGN C 
 | C 

C : C '+' D 
 | C '-' D 
 | D 

D : ID 
 | ID '(' actuals ')' 
 | ID '(' ')' 
 | INT_LIT 
 | ‘(‘ C ‘)’ 


B : B ';' A | A

【问题讨论】:

    标签: parsing compiler-construction grammar ll


    【解决方案1】:

    在 LL 中,一个产品不能从同一个终端开始有多个选项,因此如果您愿意,您可以将这些公共部分拉入一个共享的头部。所以

    D : ID 
     | ID '(' actuals ')' 
     | ID '(' ')' 
     | INT_LIT 
     | ‘(‘ C ‘)’ 
    

    变成了一些类似的东西

    D : D_things_that_start_with_ID
     | D_things_that_do_not_start_with_ID
    

    在哪里

    D_things_that_start_with_ID :
      ID D_things_that_follow_ID
    
    D_things_that_follow_ID :
      epsilon
      | '(' actuals ')' 
      | '(' ')' 
    
    D_things_that_do_not_start_with_ID :
     INT_LIT 
     | ‘(‘ C ‘)’ 
    

    其他常见的引导符号以此类推。

    【讨论】:

    • 我已经尝试过了,但问题是一旦你从第一个非终端开始执行它,它就会进入循环。请尝试从第一个开始,您会理解我的问题。谢谢
    • 哦,对了——你必须消除左递归。如何做到这一点已在 SO 上多次介绍,当然在其他地方也是如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多