Как составлять правила BNF с помощью Grammar-Kit

Я пытаюсь преобразовать файл EBNF в рабочий BNF для IntelliJ Grammar-kit.

В EBNF есть правила как таковые:

BinOpChar ::= "~" | "!" | "@" | "#" | "$" | "%" | "^" | "&" | "*" | "-"
BinOp ::= BinOpChar, {BinOpChar}

Как я могу создать такие правила, не прибегая к регулярному выражению? Причина в том, что такая конструкция встречается очень часто, и ее повторение становится повторяющимся в регулярном выражении.

Для ясности, я хотел бы иметь возможность создать правило, которое будет соответствовать @@ из BinOpChar, но не совпадать с @ @. Это возможно?


person Johnny Everson    schedule 19.01.2016    source источник


Ответы (1)


Самый простой способ - перечислить каждый оператор отдельно:

{
  tokens=[
    //...
    op_1='~'
    op_2='!'
    op_3='@'
    op_4='@@'
    op_5='#'
    //...
  ]
}

Если вы действительно хотите принять все токены n + n ^ 2, вам нужно будет использовать регулярное выражение:

{
  tokens=[
    //...
    bin_op:'regexp:[~!@#]{1,2}'
    //...
  ]
}

Но идея в том, что вы хотите использовать лексический анализатор для определения лексем, а грамматику - для определения выражений и так далее. Итак, в грамматике, если вы напишете:

{
  tokens=[
    space='regexp:\s+'
  ]
}

BinOp ::= BinOpChar [BinOpChar]
BinOpChar ::= "~" | "!" | "@" | "#"

Затем он примет @@ и @ @. Имеет ли это смысл?

person breandan    schedule 19.01.2016
comment
Странно, но последний опубликованный вами пример не работал в Live Preview, я получаю: '~', '!', '@' or '#' expected, got '@@'. Работает ли предварительный просмотр intellij live? - person Johnny Everson; 20.01.2016
comment
Извините, последний пример немного запутал (первое расширение должно быть корнем). Live Preview теперь должен работать дословно в .bnf файле. - person breandan; 20.01.2016
comment
Спасибо! '@ @' не подходит для того, что мне нужно, но смешивание токенов из регулярного выражения, похоже, работает, поэтому я буду смешивать ваши предложения. Я очень ценю вашу помощь - person Johnny Everson; 20.01.2016