我现在正在接受编程类的校长。LL(1)语法,寻找一个好的,清晰的资源
我们正在学习LL(1)语法。
我发现这本书和讲座有点不清楚,希望有人能够引荐我一个很好的资源。
我发现一些很好的youtube教程finate状态自动机和确定状态自动机,但我找不到类似的LL(1)语法。看起来有一点信息,这只是混乱。寻找“简单步骤”的方法。
祝您周末愉快! 7月4日祝你美国人快乐!
编辑:我了解的第一部作品,但我不是在后续的明确。
我现在正在接受编程类的校长。LL(1)语法,寻找一个好的,清晰的资源
我们正在学习LL(1)语法。
我发现这本书和讲座有点不清楚,希望有人能够引荐我一个很好的资源。
我发现一些很好的youtube教程finate状态自动机和确定状态自动机,但我找不到类似的LL(1)语法。看起来有一点信息,这只是混乱。寻找“简单步骤”的方法。
祝您周末愉快! 7月4日祝你美国人快乐!
编辑:我了解的第一部作品,但我不是在后续的明确。
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的一些变体。
这有帮助吗?
基本上,非终端A的后续设置就是它在锡上所说的;这是一组非A终端,可以在A.之后立即跟随。
您可能想要阅读关于LL grammars and parsers的维基百科文章,特别是关于冲突的部分 - 这可能会帮助您更好地理解它。