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

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

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

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

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

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

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 ::= "~" | "!" | "@" | "#"

Тогда он собирается принять @@ а также @ @, Имеет ли это смысл?

Другие вопросы по тегам