VHDL では、' 文字を使用して文字トークンをカプセル化するie '.'
か、属性セパレータとして使用できます (CPP の :: トークンと同様) ie string'("hello")
。
この問題は、文字を含む属性名を解析するときに発生しますie string'('a','b','c')
。この場合、単純なレクサーは最初'('
の文字を誤って文字としてトークン化し、その後の実際の文字はすべて台無しになります。
2007 年から comp.lang.vhdl Google グループにスレッドがあり、 「Lexing the ' char」というタイトルの同様の質問 があり、ユーザー diogratia による回答があります。
case '\'': /* IR1045 check */ if ( last_token == DELIM_RIGHT_PAREN || last_token == DELIM_RIGHT_BRACKET || last_token == KEYWD_ALL || last_token == IDENTIFIER_TOKEN || last_token == STR_LIT_TOKEN || last_token == CHAR_LIT_TOKEN || ! (buff_ptr<BUFSIZ-2) ) token_flag = DELIM_APOSTROPHE; else if (is_graphic_char(NEXT_CHAR) && line_buff[buff_ptr+2] == '\'') { CHARACTER_LITERAL: buff_ptr+= 3; /* lead,trailing \' and char */ last_token = CHAR_LIT_TOKEN; token_strlen = 3; return (last_token); } else token_flag = DELIM_APOSTROPHE; break;
問題レポート IR1045 を参照してください: http://www.eda-twiki.org/isac/IRs-VHDL-93/IR1045.txt
上記のコード フラグメントからわかるように、最後のトークンをキャプチャして、次のように特定するために使用できます。
foo <= std_logic_vector'('a','b','c');
先を見越したり、後戻りしたりせずに。
ただし、私の知る限り、flex は解析された最後のトークンを追跡しません。
最後に解析されたトークンを手動で追跡する必要なく、この字句解析タスクを達成するためのより良い方法はありますか?
それが役立つ場合は、IntelliJ GrammarKit を使用しています。