如何使用 Grammar-Kit 编写 BNF 规则
How to compose BNF rules using Grammar-Kit
我正在尝试将 EBNF 文件转换为适用于 IntelliJ Grammar-kit 的 BNF。
在 EBNF 中有这样的规则:
BinOpChar ::= "~" | "!" | "@" | "#" | "$" | "%" | "^" | "&" | "*" | "-"
BinOp ::= BinOpChar, {BinOpChar}
如何在不借助正则表达式的情况下创建此类规则?原因是这种构造经常发生并且在正则表达式中变得重复。
明确地说,我希望能够创建一个规则来匹配 @@
来自 BinOpChar
但不匹配 @ @
。这可能吗?
最简单的方法是独立列出每个运算符:
{
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 ::= "~" | "!" | "@" | "#"
然后它将接受@@
和@ @
。这有意义吗?
我正在尝试将 EBNF 文件转换为适用于 IntelliJ Grammar-kit 的 BNF。
在 EBNF 中有这样的规则:
BinOpChar ::= "~" | "!" | "@" | "#" | "$" | "%" | "^" | "&" | "*" | "-"
BinOp ::= BinOpChar, {BinOpChar}
如何在不借助正则表达式的情况下创建此类规则?原因是这种构造经常发生并且在正则表达式中变得重复。
明确地说,我希望能够创建一个规则来匹配 @@
来自 BinOpChar
但不匹配 @ @
。这可能吗?
最简单的方法是独立列出每个运算符:
{
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 ::= "~" | "!" | "@" | "#"
然后它将接受@@
和@ @
。这有意义吗?