Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 词法分析器与语法分析器通信_Parsing_Compiler Construction_Lexical Analysis - Fatal编程技术网

Parsing 词法分析器与语法分析器通信

Parsing 词法分析器与语法分析器通信,parsing,compiler-construction,lexical-analysis,Parsing,Compiler Construction,Lexical Analysis,词法分析器和解析器上的大部分资源都说明了如何使用流在它们之间进行通信(或者我是这么理解的) 解释如下:解析器请求下一个令牌,比如调用函数getNextToken(),lexer通过返回下一个令牌来响应它。我们应该将它们视为在同一程序内交互的两个对象,还是通过流交互的两个不同程序 此外,我还无法理解为什么没有选择串行方法,即词法分析器一直运行到提供的源代码的末尾,只有到那时解析器才使用词法分析器的输出进行解析。确切地说,如果词法分析器仅在解析器请求下一个标记时读取下一个词素,那么如何处理错误?特别

词法分析器和解析器上的大部分资源都说明了如何使用流在它们之间进行通信(或者我是这么理解的)

解释如下:解析器请求下一个令牌,比如调用函数
getNextToken()
,lexer通过返回下一个令牌来响应它。我们应该将它们视为在同一程序内交互的两个对象,还是通过流交互的两个不同程序


此外,我还无法理解为什么没有选择串行方法,即词法分析器一直运行到提供的源代码的末尾,只有到那时解析器才使用词法分析器的输出进行解析。确切地说,如果词法分析器仅在解析器请求下一个标记时读取下一个词素,那么如何处理错误?特别是当错误发生在文件末尾时,解析器完成的所有计算都可能由于错误而浪费(假设一个非常基本的解析器没有任何错误处理功能)。最近的输出是缓存的吗?

我下面的回答只涉及Flex Bison(或Lex Yacc)编译模型。我对其他模型知之甚少

我认为lexer/parser组合是同一个程序中的两个协作模块。 当您将Flex与Bison一起使用时,您会看到后者调用了前者提供的函数
yylex()
yylex()
相当于您问题中的
getNextToken()
函数)。因此,将它们视为一个项目中的合作单位,而不是两个不同项目中的合作单位,更为合理。此外,如果lexer和parser是两个不同的程序,则必须处理进程间通信、共享内存和相关问题,从而使手头的任务更加复杂

回答你的第二个问题: 我可以想到一个重要的问题,那就是在lexer读取完所有输入后,解析器开始工作时可能会出现:对于中等大小的程序来说,内存使用量将是巨大的,因为您必须在内存中存储每个令牌的数据结构(想想像
=
这样的令牌占用了内存中的多个字节,您很快就会明白为什么它不可伸缩)

至于错误处理:如果lexer无法将输入匹配到任何正则表达式,那么
yylex()
应该使用如下flex规则向解析器返回-1:

.               { return -1; }
(注意第一列中的不可见周期,它与除
\n
之外的任何输入符号相匹配)

注意:此规则应该是flex文件中出现的最后一条规则,因为规则的顺序决定优先级:flex使用flex文件中第一条可能的规则匹配令牌。)

lexer的返回值-1表示标记化错误,Bison解析器通过调用
yyerror(char*)
(理想情况下由您定义)自动处理该错误;否则,如果输入遇到解析错误,解析器将再次调用
yyerror(char*)

此外,如果您希望在遇到错误时显示错误的代码段,那么您必须有一种方法来访问给定有缺陷标记的相关源代码,这意味着完全读取输入然后进行解析的方法将根本不起作用,除非在标记化时存储每个标记的相关源代码,例如本质上是一个编译器的内存庞然大物

关于词法分析器和解析器的大部分资源都说明了它的用法 在它们之间进行通信的流的数量(或者我所理解的)

我见过的没有一个能做到这一点,它们依赖于词法分析器作为解析器调用的单一方法