如标题中所述,词法分析器应返回/提供解析器哪种数据类型?在阅读Wikipedia 的词法分析文章时,它指出:
在计算机科学中,词法分析是将一系列字符(例如在计算机程序或网页中)转换为一系列标记(具有已标识“含义”的字符串)的过程。
但是,与上述说法完全矛盾的是,当我在另一个站点上问过另一个问题(“代码审查”,如果您很好奇)得到回答时,回答者表示:
词法分析器通常读取字符串,并将其转换为词位流。词素只需要是一串数字。
他给了这个视觉效果:
nl_output => 256
output => 257
<string> => 258
稍后,在他提到的文章中Flex
,他已经存在一个词法分析器,并说用它编写“规则”比手工编写词法分析器更简单。他继续给我这个例子:
Space [ \r\n\t]
QuotedString "[^"]*"
%%
nl_output {return 256;}
output {return 257;}
{QuotedString} {return 258;}
{Space} {/* Ignore */}
. {error("Unmatched character");}
%%
为了进一步了解并获得更多信息,我阅读了有关Flex的Wikipedia文章。Flex文章显示,您可以通过以下方式使用令牌定义一组语法规则:
digit [0-9]
letter [a-zA-Z]
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return SLASH; }
"(" { return LPAREN; }
")" { return RPAREN; }
";" { return SEMICOLON; }
"," { return COMMA; }
"." { return PERIOD; }
":=" { return BECOMES; }
"=" { return EQL; }
"<>" { return NEQ; }
"<" { return LSS; }
">" { return GTR; }
"<=" { return LEQ; }
">=" { return GEQ; }
"begin" { return BEGINSYM; }
"call" { return CALLSYM; }
"const" { return CONSTSYM; }
"do" { return DOSYM; }
"end" { return ENDSYM; }
"if" { return IFSYM; }
"odd" { return ODDSYM; }
"procedure" { return PROCSYM; }
"then" { return THENSYM; }
"var" { return VARSYM; }
"while" { return WHILESYM; }
在我看来,Flex词法分析器正在返回关键字\令牌的字符串。但是它可能返回等于某些数字的常量。
如果词法分析器要返回数字,它将如何读取字符串文字?对于单个关键字,返回数字是可以的,但是如何处理字符串呢?词法分析器不必将字符串转换为二进制数字,然后解析器会将数字转换回字符串。对于词法分析器来说,返回字符串似乎更合乎逻辑(并且更容易),然后让解析器将任何数字字符串文字转换为实际数字。
还是词法分析器可能同时返回两者?我一直在尝试用c ++写一个简单的词法分析器,它使函数只有一个返回类型。因此导致我问我的问题。
将我的问题压缩为一个段落:在编写词法分析器时,假设它只能返回一种数据类型(字符串或数字),那将是更合理的选择?