Поддержка пользовательского ввода грамматики (DSL) - PullRequest
0 голосов
/ 27 февраля 2019

Я определил грамматику для предметно-ориентированного языка.Например, выглядит так:

Expression -> (SingleObjectExpression | MultipleObjectExpression)
SingleObjectExpression -> Identifier AttributeFilter:* RelationFilter:* ConnectionFilter:* 
MultipleObjectExpression -> (OrConnected | AndConnected) AttributeFilter:* RelationFilter:* ConnectionFilter:* 
OrConnected -> "(" SingleObjectExpression _ "OR" _ SingleObjectExpression ")"
AndConnected -> "(" SingleObjectExpression _ "AND" _ SingleObjectExpression ")"
AttributeFilter -> ".attribute(" singleString "=" singleString ")"
RelationFilter -> ".isParentOf(" SingleObjectExpression ")"
ConnectionFilter -> ".hasConnection(" ( "from(" SingleObjectExpression ")" | "to(" SingleObjectExpression ")" ) AttributeFilter:* ")"
Identifier -> singleString
singleString -> [a-zA-Z]:+
_ -> [ \s]:+

Сокращено, просто чтобы дать идею.Допустимые входные данные для этой грамматики будут, например:

  • Server.attribute (пароль = kgfjerjeks) .isParentOf (Программное обеспечение) .hasConnection (к (База данных) .attribute (secure = true))
  • (PC1.attribute (user = dumb) И PC2.attribute (user = smart)). HasConnection (to (Server))

Компилятором и поставщиком для грамматики является Nearley.js.

Теперь я хочу создать пользовательский интерфейс (HTML && CSS && Javascript).Этот интерфейс должен обеспечивать поле ввода, в котором пользователь может строить такие предложения с предоставленной грамматикой.

Чтобы свести к минимуму возможные ошибки, я бы хотел помочь пользователю.Это должно показать пользователю, какие параметры ввода он имеет в какой позиции.Я уже сам решил, что пользователь должен дважды щелкнуть элементы внутри правила, а затем заменить отмеченные элементы.Но, похоже, это не лучшее решение.

У кого-нибудь есть умная идея?

...