2

lex と yacc を使用して、Lua に似た言語用のパーサーを作成しようとしています。強制的なステートメントターミネータ(セミコロン)のない言語であり、この機能により、関数呼び出しがステートメントか式かを判断できませんでした。
たとえば、次の関数:

function foo()  
  return { x = 5 }  
end  

テーブルを返します。いくつかの使用法を次に示します。

foo()  -- this is a statement
t = foo()  -- foo is an expression
a = foo().x  -- foo() is a prefix-expression
print(foo())  -- foo() is an expression

単純な関数呼び出しが式、プレフィックス式、またはステートメントになる可能性があるため、競合のない yacc コードを書くことができません。
この機能を実装するにはどうすればよいですか? 強制ステートメントターミネータを導入することが唯一の方法ですか?

どうもありがとうございました。

4

1 に答える 1

1

T-SQL パーサーを実装するときにも、同様の課題を解決する必要がありました。;文法に必須であるかのように を含めることになり、構文エラーが発生した場合は、仮想;トークンを挿入して現在のステートメントを終了し、パーサーに削減を再試行させました。

私のユースケースでは、これは非常にうまく機能します。おそらく、あなたのケースでも機能する可能性があります。

于 2010-11-12T11:53:25.950 に答える