Google Go のセミコロン挿入を flex ファイルに追加することに興味があります。
Go ドキュメントから:
セミコロン
C と同様に、Go の正式な文法ではセミコロンを使用してステートメントを終了します。C とは異なり、これらのセミコロンはソースに表示されません。代わりに、レクサーはスキャン時にセミコロンを自動的に挿入する単純なルールを使用するため、入力テキストにはセミコロンがほとんど含まれません。
ルールはこれです。改行の前の最後のトークンが識別子 (int や float64 などの単語を含む) である場合、数値や文字列定数などの基本的なリテラル、またはトークンの 1 つ
break continue fallthrough return ++ -- ) }
lexer は常にトークンの後にセミコロンを挿入します。これは、「ステートメントを終了できるトークンの後に改行が来る場合は、セミコロンを挿入する」と要約できます。
右中括弧の直前のセミコロンも省略できます。
go func() { for { dst <- <-src } }()
セミコロンは必要ありません。慣用的な Go プログラムでは、初期化子、条件、および継続要素を区切るために、 for ループ句などの場所にのみセミコロンがあります。また、コードをそのように記述する場合、1 行で複数のステートメントを区切るためにも必要です。
1 つの警告。制御構造 (if、for、switch、または select) の左中括弧を次の行に配置しないでください。これを行うと、中括弧の前にセミコロンが挿入され、望ましくない効果が生じる可能性があります。このように書きます
if i < f() { g() }
このようではない
if i < f() // wrong! { // wrong! g() // wrong! } // wrong!
これを行うにはどうすればよいですか (ストリームにトークンを挿入するにはどうすればよいですか? 一致した最後のトークンを見て、それが良いアイデアかどうかを確認するにはどうすればよいですか?
私もバイソンを使用していますが、Goはセミコロンの挿入にレクサーを使用しているようです。