Как составить правила 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 ::= "~" | "!" | "@" | "#"
Тогда он собирается принять @@
а также @ @
, Имеет ли это смысл?