で PEG を開始していPEG.js
ます。
頭がよくわからないことがあります...単純なことだと思いますが、概念を理解しようとすると頭が痛くなります...
次の 2 規則文法を考えてみましょう。
name
= name:.* {return name.join("")}
put
= "put " a:name " into " b:name "." {put(a,b)}
「foo を bar に入れる」というパーサーを渡すことができるようにしたいと考えています。とput("foo","bar")
評価させます。
しかし、PEG.jsは私にエラーを与えますExpected " into " or any character but end of input found.
name
ルールの正規表現がより具体的である場合、この問題を修正できると思います.*
が、なぜそうしなければならないのですか? パーサーは、「.」だけでなく、「 into 」が近づいていることを先読みして確認できるほどスマートではありませんか。最後に?
探しているものをどのように達成できますか? これはおそらく「ボトムアップ」文法と「トップダウン」文法の違いでしょうか?
編集:正規表現/put (.*) into (.*)/g
は私が望むように機能します-私がそれを渡すと"put foo into bar"
、それは私$1="foo"
に andを与えます$2="bar"
. PEGjsまたはJisonを使用して、これと同じ機能を取得できるかどうかを尋ねているだけです(トークンの境界がどこにあるかを判断する前に文字列全体を考慮に入れます)。