タイトルで述べたように、レクサーはどのデータ型をパーサーに返す/与える必要がありますか?ウィキペディアが持っている字句解析の記事を読んだとき、それは次のように述べました:
コンピュータサイエンスでは、字句解析とは、一連の文字(コンピュータプログラムやWebページなど)を一連のトークン(識別された「意味」を持つ文字列)に変換するプロセスです。
しかし、上記の声明と完全に矛盾して、別のサイトで質問した別の質問(好奇心があればコードレビュー)が回答されたとき、回答者は次のように述べました:
字句解析プログラムは通常、文字列を読み取り、これを語彙素のストリームに変換します。語彙素は数字のストリームである必要があります。
そして彼はこの視覚を与えました:
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");}
%%
私の洞察を深め、より多くの情報を得るために、WikipediaのFlexに関する記事を読みました。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レクサーはキーワードの文字列を返しているように思えます。ただし、特定の数値に等しい定数を返すこともできます。
レクサーが数値を返す場合、文字列リテラルはどのように読み取られますか?単一のキーワードでは数値を返すことは問題ありませんが、文字列をどのように処理しますか?字句解析プログラムは文字列を2進数に変換する必要はありません。その後、パーサーは数値を文字列に変換します。字句解析器が文字列を返し、パーサーに任意の数値文字列リテラルを実際の数値に変換させると、はるかに論理的(かつ簡単)に思えます。
または、レクサーは両方を返すことができますか?私はc ++で簡単な字句解析プログラムを作成しようとしました。これにより、関数の戻り値の型を1つだけにすることができます。したがって、私の質問をするように私を導く。
私の質問を段落に凝縮する:レキサーを書いて、それが1つのデータ型(文字列または数字)のみを返すことができると仮定すると、どちらがより論理的な選択でしょうか?