Я определил грамматику для предметно-ориентированного языка.Например, выглядит так:
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).Этот интерфейс должен обеспечивать поле ввода, в котором пользователь может строить такие предложения с предоставленной грамматикой.
Чтобы свести к минимуму возможные ошибки, я бы хотел помочь пользователю.Это должно показать пользователю, какие параметры ввода он имеет в какой позиции.Я уже сам решил, что пользователь должен дважды щелкнуть элементы внутри правила, а затем заменить отмеченные элементы.Но, похоже, это не лучшее решение.
У кого-нибудь есть умная идея?