【问题标题】:LL(1) grammars, looking for a good, clear resourceLL(1) 语法,寻找好的、清晰的资源
【发布时间】:2010-07-04 19:00:23
【问题描述】:

我现在正在学习编程课程的校长。

我们正在学习 LL(1) 语法。

我发现这本书和讲座有些不清楚,希望有人可以向我推荐一个好的资源。

我找到了一些关于有限状态自动机和确定状态自动机的很好的 youtube 教程,但我找不到任何与 LL(1) 语法类似的东西。似乎有相当多的信息,这只是令人困惑。寻找“简单步骤”的方法。

周末愉快!祝所有美国人 7 月 4 日快乐!


编辑:我了解第一个是如何工作的,但我不清楚接下来的内容。

【问题讨论】:

    标签: theory grammar


    【解决方案1】:

    LL 基本上意味着“自上而下”。

    自上而下的解析器首先要解析语法中的顶级元素,消耗启动该元素所需的标记,然后继续“向下”递归到语法中更详细的元素语法。

    理解自顶向下解析的最简单方法是实现解析器。一个假设的示例可能如下所示:

    void parseFile()
    {
        while(classesContinue())
        {
            parseClass();
        }
    }
    
    void parseClass()
    {
        consume(Tokens.Class);
        consume(Tokens.ID);
        consume(Tokens.LCurly);
        while(membersContinue())
        {
            parseMember();
        }
        consume(Tokens.RCurly);
    }
    

    LL 旁边的括号中的数字(如 LL(1))是实现解析器必须做出的任何“选择”所需的最大预读次数。例如,“parseMember”可能看起来像:

    void parseMember()
    {
        parseTypeName();
        parseID();
        switch (lookAhead())
        {
            case Tokens.Semi:
            case Token.Equals:
                parseVariableDecl();
                break;
            default:
                parseMethod();
                break;
        }
    }
    

    在这种情况下,解析器将是 LL(1),因为它需要一个前瞻标记。

    在任何情况下,LL(1) 语法只是正式符号中的 LL(1) 解析器的规范,通常是 EBNF 的一些变体。

    这有帮助吗?

    【讨论】:

      【解决方案2】:

      基本上,非终结符 A 的后续集合就是它在锡上所说的内容;它是一组可以紧跟在 A 之后的非终结符。

      您可能想阅读有关 LL grammars and parsers 的 Wikipedia 文章,特别是有关冲突的部分 - 这可能会帮助您更好地理解它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多