Я пытаюсь реализовать простой DSL, который анализирует основные арифметические выражения. Это нужно сделать в браузере, поэтому я использую PEGjs для генерации парсера.
Термины в выражении могут быть числами (целыми или действительными), переменными (переменные - это свойства объекта контекста, переданного синтаксическому анализатору), условными операторами или свойствами, доступ к которым осуществляется через точечную нотацию.
Я хочу, чтобы условные выражения выглядели так condition?value
, где, если condition
истинно, термин равен 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
}
Я просмотрел пример грамматики для javascript в репозитории PEGjs на github, и условное правило очень похоже на то, что у меня здесь, но я все еще не могу заставить его работать.
Каким будет правильный способ реализации условного оператора, подобного тому, который я описал в правиле PEGjs?