0

さまざまなコメントや「終わりのない」コメント エラーさえもキャッチするルールを書こうと奮闘しています。

これは Pascal に基づく言語用です。コメントには次の形式を使用できます。

(* ...with any characters within... *)

(*
 * separated onto multiple lines
 *)

(* they can contain "any" symbol, so -, +, :, ; , etc. should be ignored *)

ただし、次のようなコメント エラーをキャッチする必要があります。

(* this comment has no closing r-parenthesis *また(* this comment is missing an asterisk )

私はこれまでのところこれを持っています:

{%
int yylval;
vector<string> string_table;
int string_table_index = 0;
int yyline = 1, yycolumn = 1;
%}

delim   [ \t\n]
ws      {delim}+
letter  [a-zA-Z]
digit   [0-9]
id      {letter}({letter}|{digit})*
number  {digit}+
float   {digit}+(\.{digit}+)?(E[+\-]?{digit}+)?


%%
{ws}      {yycolumn += yyleng;}
"(*" {
    int c;
    yycolumn += yyleng;
    while ((c = yyinput()) != '*' && c != EOF) {
        c = yyinput(); /* read additional text */
        if (c == '*') {
            while ((c = yyinput()) == '*') {
                c = yyinput();
                if (c == ')') {
                    break; /* found the end */
                } else if (c == EOF) {
                    cout << "EOF in comment\n";
                    break;
                } else {
                    cout << "unended comment, line = "  
                    << yyline << ", column = "
                    << yycolumn-yyleng << "\n";
                }
            }
        }
    }
 }
  1. 最後の括弧をキャッチしていません(常に出力されRPARENtokenます!)、

  2. コメント内のすべての文字を無視しているわけではありません(つまりMINUStoken、「-」の出力)

  3. 複数行のコメントをキャッチすることはできません。

  4. 終了していないコメント エラーを正しくキャッチしているかどうかはわかりません。

    私は近くにいると思います...誰かが私がどこで間違ったかを見ることができますか?

4

1 に答える 1

4

パターンに余分なコードをすべて記述しなくても済むように、開始条件の使用を検討してください。(*以下に簡単な例を書きました。

%x COMMENT
%%
"(*" { BEGIN(COMMENT); }
<COMMENT>{
    "*)" { BEGIN(INITIAL); }
    <<EOF>> { printf("EOF in comment\n"); }
    . {}
}

基本的に、レクサーはコメントの先頭を見つけると状態に入り、ブロックCOMMENT内のルールのみをチェックします。<COMMENT>が見つかる*)と、初期状態に戻ります。yy_push_state(COMMENT)複数の状態を使用することを計画している場合は、yy_pop_state(COMMENT)の代わりにを使用する方がおそらく良いことに注意してくださいBEGIN(STATENAME)

コメントエラーの基準が何であるか(たとえば、コメントでEOFに遭遇することとどのように異なるか)は完全にはわかりませんが、これらのケースを処理するために拡張できる可能性があります。

于 2013-02-07T01:14:40.693 に答える