我现在正在攻读编程课程的负责人。
我们正在学习LL(1)语法。
我发现这本书和讲座有点不清楚,并希望有人可以把我推荐给一个好的资源。
我找到了一些关于finate状态自动机和确定状态自动机的优秀youtube教程,但我找不到任何类似的LL(1)语法。似乎有一些信息,这只是令人困惑。寻找“简单步骤”的方法。
周末愉快! 7月4日对所有美国人开心!
编辑:我了解First的工作方式,但我不清楚以下内容。
答案 0 :(得分:2)
自上而下的解析器首先是想要首先解析语法中的顶级元素,使用启动该元素所需的标记,然后继续“向下”递归到更详细的元素。语法。
理解自顶向下解析的最简单方法是实现解析器。一个假设的例子可能如下:
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的维基百科文章,特别是有关冲突的部分 - 这可能有助于您更好地理解它。