タイトルが示すように、たとえば解析しようとしています
term(A, b, c(d, "e", 7))
のようなLuaテーブルで
{term, {A, b, {c, {d, "e", 7}}}}
これは私が構築した文法です:
local pattern = re.compile[=[
term <- variable / function
argument <- variable / lowercase /number / string
function <- {|lowercase {|(open argument (separator (argument / function))* close)?|}|}
variable <- uppercase
lowercase <- {[a-z][A-Za-z0-9]*}
uppercase <- {[A-Z][A-Za-z0-9]*}
string <- '"' {~ [^"]* ~} '"'
number <- {[0-9]+}
close <- blank ")"
open <- "(" blank
separator <- blank "," blank
blank <- " "*
]=]
次の問題があります。
- ネストされた用語を解析できません。上記の例では、 のみを返します
{term, {} }
(ただし、 で問題ありませんterm(A, b, c)
)。 - 使用した文字列から引用符を取り除く
{~ ~}
ために、そのため、すべてのキャプチャを下の行から移動する必要がargument
ありました。term
これを回避する方法はありますか? A
たとえば、のようなものの代わりに、各要素にキーを関連付けてそのタイプを指定したいと思います{value = "A", type = "variable"}
。これを行う方法を見つけました{:name: :}
が、テーブル内の要素の順序が失われます (新しいテーブルを作成するのではなく、単にキーを追加するためです。この場合variable="A"
、この要素の順序は固定されていません)。注文を維持するアイテムにタグを付けるにはどうすればよいですか?