4

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 を使用しています。

4

1 に答える 1