基本的な算術式を解析する単純な DSL を実装しようとしています。これはブラウザーで行う必要があるため、PEGjs を使用してパーサーを生成しています。
式の用語は、数値 (整数または実数)、変数 (変数はパーサーに渡されるコンテキスト オブジェクトのプロパティ)、条件、またはドット表記を介してアクセスされるプロパティです。
条件をこの のようにしたいのですcondition?value
が、condition
が true の場合、用語は に相当しvalue
ます。の両側の変数は、?
このようなオブジェクトのプロパティにアクセスするドット表記にすることもできますobject.property1?object.property2
。
したがって、パーサーに次のようなオブジェクトが渡された場合:
context = {
depth: 100,
material: {
thickness: 20
include: true
}
edge: {
face: 4.5
}
}
表現:
500 + depth + material.include?edge.face + material.thickness
に等しい必要があり624.5
ます。
私は PEGjs オンライン エディターを使用しています。私はさまざまなアプローチを試しましたが、条件を釘付けにすることはできません。他のすべてが機能します。関連するルールは次のとおりです。
Variable "variable"
= variable:identifier accessor:("." identifier)* {
var result = context[variable], i
for (i = 0; i < accessor.length; i++) {
result = result[accessor[i][1]]
}
return result
}
identifier
= identifier:$([0-9a-zA-Z_\$]+)
Conditional
= condition:Variable "?" value:Variable {
return condition ? value : 0
}
PEGjs github repo で javascript の文法例を見てきましたが、条件付きルールはここにあるものとよく似ていますが、まだ機能させることができません。
PEGjs ルールで説明したような条件ステートメントを実装する正しい方法は何でしょうか?