在不依赖词法分析器规范的情况下生成解析器生成器的小型工作示例?
Producing a small working example of a parser generator without relying on a lexer spec?
是否可以在不依赖词法分析器规范的情况下使用 yacc 生成解析器生成器的小型工作示例?
大多数教科书解析器规范都依赖于词法分析器,这使得解析器示例对于学生来说有点复杂(恕我直言)。
如果“没有词法分析器规范”是指不从 (f)lex 规范生成词法扫描器,那么您会在 Bison 手册中找到许多 small working parsers with hand-built lexers 的示例。对于学生和新手来说,这些是重要的(而且经常被忽视的)资源。
如果您的意思是“没有词法分析器”,那么答案是“否”。 Yacc(据我所知,它的所有 commonly-used 衍生物)要求输入来自 yylex
外部函数。在正常情况下,yacc/byacc/bison-generated 解析器根本不与 stdio
交互;他们依靠 yylex
将输入分解为标记,他们依靠 yyerror
处理错误消息。
还有其他 parser-generators 要么具有词法分析 built-in,因此只有一个规范(尽管它通常分为两部分),要么产生“无扫描器解析器”。这两种方法似乎都有自己的特质,可能会让学习者感到困惑,但我认为在不违反 Whosebug 对 opinion-based 答案的警告的情况下,不可能充分讨论这一点。
在最简单的情况下,您可以编写一个简单的词法分析器,它只从标准输入读取单个字符标记:
int yylex() {
return fgetc(stdin);
}
然后您需要编写一个解析器来读取每个字符,构建更大的“标记”,例如数字和标识符 non-terminals,并明确跳过空格。这既不高效也不琐碎,但却是理解解析的有用练习。
是否可以在不依赖词法分析器规范的情况下使用 yacc 生成解析器生成器的小型工作示例? 大多数教科书解析器规范都依赖于词法分析器,这使得解析器示例对于学生来说有点复杂(恕我直言)。
如果“没有词法分析器规范”是指不从 (f)lex 规范生成词法扫描器,那么您会在 Bison 手册中找到许多 small working parsers with hand-built lexers 的示例。对于学生和新手来说,这些是重要的(而且经常被忽视的)资源。
如果您的意思是“没有词法分析器”,那么答案是“否”。 Yacc(据我所知,它的所有 commonly-used 衍生物)要求输入来自 yylex
外部函数。在正常情况下,yacc/byacc/bison-generated 解析器根本不与 stdio
交互;他们依靠 yylex
将输入分解为标记,他们依靠 yyerror
处理错误消息。
还有其他 parser-generators 要么具有词法分析 built-in,因此只有一个规范(尽管它通常分为两部分),要么产生“无扫描器解析器”。这两种方法似乎都有自己的特质,可能会让学习者感到困惑,但我认为在不违反 Whosebug 对 opinion-based 答案的警告的情况下,不可能充分讨论这一点。
在最简单的情况下,您可以编写一个简单的词法分析器,它只从标准输入读取单个字符标记:
int yylex() {
return fgetc(stdin);
}
然后您需要编写一个解析器来读取每个字符,构建更大的“标记”,例如数字和标识符 non-terminals,并明确跳过空格。这既不高效也不琐碎,但却是理解解析的有用练习。