在不依赖词法分析器规范的情况下,生成解析器生成器的小型工作示例?

问题描述

是否可以使用yacc生成解析器生成器的小型工作示例,而无需依赖词法分析器规范? 大多数教科书的解析器规范都依赖词法分析器,这使得解析器示例对于学生来说(imho)有点复杂。

解决方法

如果“没有词法分析器规范”是指没有根据(f)lex规范生成词法扫描器,那么您将在Bison手册中找到许多small working parsers with hand-built lexers的示例。对于学生和新手来说,这些都是重要的(而且经常被忽略)资源。

如果您的意思是“没有词法分析器”,那么答案是“否”。 Yacc(据我所知,它的所有常用衍生物)都要求输入来自stdio外部函数。在正常情况下,yacc / byacc / bison生成的解析器根本不会与yylex进行交互;他们依靠yyerror将输入分解为令牌,然后依靠T[] arg_36_0 = this._items 来处理错误消息。

还有其他解析器生成器,它们内置了词法分析,因此只有一个规范(尽管它通常分为两部分),或者生成“无扫描解析器”。这两种方法似乎都有自己的特质,这可能会使学习者感到困惑,但是我不认为有可能在不违反StackOverflow针对基于观点的答案的警告的情况下充分讨论这一点。

,

在最简单的情况下,您可以编写一个简单的词法分析器,该词法分析器仅从stdin中读取单个字符标记:

int yylex() {
    return fgetc(stdin);
}

然后,您需要编写一个解析器来读取每个字符,建立较大的“令牌”(例如数字和标识符)作为非终结符,并显式跳过空格。这既不高效也不琐碎,但对于理解解析却是有用的练习。