如何解决在不依赖词法分析器规范的情况下,生成解析器生成器的小型工作示例?
是否可以使用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);
}
然后,您需要编写一个解析器来读取每个字符,建立较大的“令牌”(例如数字和标识符)作为非终结符,并显式跳过空格。这既不高效也不琐碎,但对于理解解析却是有用的练习。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。