LL(1)语法,寻找一个好的,明确的资源

时间:2010-07-04 19:00:24

标签: theory grammar

我现在正在攻读编程课程的负责人。

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

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

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

周末愉快! 7月4日对所有美国人开心!


编辑:我了解First的工作方式,但我不清楚以下内容。

2 个答案:

答案 0 :(得分:2)

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

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

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

void parseFile()
{
    while(classesContinue())
    {
        parseClass();
    }
}

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

LL旁边的paranthesis中的数字(如在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的一些变体。

这有帮助吗?

答案 1 :(得分:0)

基本上,非终端A的跟随集合正如它在锡上所说的那样;它是一组非终端,可以在A之后立即跟随。

您可能希望阅读有关LL grammars and parsers的维基百科文章,特别是有关冲突的部分 - 这可能有助于您更好地理解它。