1

EBNF ファイルを IntelliJ Grammar-kit 用の動作する BNF に変換しようとしています。

EBNF には、次のような規則があります。

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

正規表現に頼らずにそのようなルールを作成するにはどうすればよいですか? その理由は、この種の構成が非常に頻繁に発生し、正規表現で行うと繰り返しになるためです。

@@明確にするために、一致するBinOpCharが一致しないルールを作成できるようにしたいと思います@ @。それは可能ですか?

4

1 に答える 1

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

それからそれは受け入れるつもりです@@そして@ @. それは理にかなっていますか?

于 2016-01-19T22:46:14.383 に答える