問題タブ [ebnf]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Javaの注釈の文法
Javaの注釈の文法を説明するBNFまたはEBNFはありますか?
grammar - EBNFまたはBNFを使用して再帰下降パーサーを作成する方が簡単ですか?
文法用のBNFとEBNFがあります。BNFは明らかにより冗長です。BNFを使用して再帰下降パーサーを構築する限り、私はかなり良い考えを持っています。これには多くのリソースがあります。EBNFを再帰下降パーサーに変換するためのリソースを見つけるのに問題があります。これはもっと難しいからですか?CS理論のクラスで、EBNFを調べたことを思い出しますが、EBNFを再帰下降パーサーに変換することはしませんでした。BNFを再帰下降パーサーに変換することをやり直しました。
私が尋ねている理由は、EBNFがよりコンパクトだからです。
{
EBNFの一般的な見方から、との間に囲まれた用語はループ}
に変換できることに気付きました。while
他にガイドラインやルールはありますか?
syntax - BNF vs EBNF vs ABNF: どちらを選ぶべきか?
言語の構文を考え出そうとしています。私はこれらの 3 つについて少し読んだことがありますが、ある人ができて別の人ができないことは実際にはわかりません。どちらか一方を使用する理由はありますか? それとも単に好みの問題ですか?
parsing - EBNF文法の異なるトークンで重複する文字グループを処理するには?
文字ストリームを解析するために LL(k) EBNF 文法を使用しています。3 種類のトークンが必要です。
最初の 2 つのトークン宣言は、共通の文字を共有していないため問題ありません。
ただし、3 番目のmessage
, は無効です。これは、一部の文字列が と の両方である可能性がnum
ありmessage
( など"123"
)、他の文字列が と の両方である可能性があるident
ためですmessage
( など"Hello"
)。したがって、トークナイザーは正しく区別できません。
もう 1 つの例は、整数と実数の区別です。すべての実数に少なくとも 1 つの小数点以下の桁数が必要でない限り (つまり、1 は 1.0 としてエンコードする必要がありますが、これは私にとってはオプションではありません)、これら 2 つの数値の違いについて文法でサポートを得ることができません。種類。すべての値が実数として表現され、ポイントの後にチェックを行う必要がありました。それは問題ありませんが、最適ではありません。私の本当の問題はmessage
トークンにあります。そのための回避策が見つかりません。
問題は、LL(k) EBNF 文法でこれを行うことができるかということです。CoCo/Rを使用してパーサーとスキャナーを生成しています。
LL(k) EBNF でそれができない場合、他にどのようなオプションを検討できますか?
編集これは、CoCo/R から取得した出力です。
language-agnostic - TurboPascalのBNF/EBNF(OOPのため、5.5以降が望ましい)?
Turbo PascalのBNFまたはEBNFがどこかで利用可能かどうかを知っている人はいますか(LEGALLY !!)?
lexer - ANTLRの「a」..「z」が$や£などのワイルドカードと一致するのはなぜですか
次の文法を実行すると:
そして私は入力「?test」を与えますなぜantlrはこれを有効な入力として受け入れるのですか?('a' ..'z')は小文字のアルファベット内の文字にのみ一致すると思いましたか?
antlr - ANTLR、ANTLRでBNF、EBNFデータを変換する方法は?
CSV データのパーサーを生成する必要があります。どういうわけか、CSVデータのBNF、EBNFを書くことができましたが、これをANTLR文法(パーサージェネレーター)に変換する方法がわかりません。たとえば、EBNF では次のように記述します。
しかし、これを ANTLR で記述してパーサーを生成すると、エラーが発生し、括弧が使用されません。私は ANTLR の専門家ではありません。
scala - 再帰的なbnfのScala Parser Combinatorsトリック?
この構文に一致させようとしています:
私のscala packratパーサーコンビネーターは次のようになります:
しかし、これはうまくいきません。それは「貪欲に一致」し、私に教えてくれます:
または、|
を aに変更すると|||
、stackoverflow が発生します。
エラーが発生する理由がわかりました。上記のような構文を解析するにはどうすればよいですか? それは私には難解ではないようです
編集: http://scala-programming-language.1934581.n4.nabble.com/Packrat-parser-guidance-td1956908.htmlで参照されている論文に基づいて、 私のプログラムが実際に新しい packrat パーサーを使用していないことがわかりました。
すなわち。に変更Parser[Any]
して代わりにPackratParser[Any]
使用するlazy val
def
上記を次のように書き直しました。
python - マークダウンのような言語のパーサーの実装
マークダウンとSOで使用されているものに似たマークアップ言語があります。
レガシーパーサーは正規表現に基づいており、維持するのが完全に悪夢だったので、EBNF文法に基づいて、mxTextTools/SimpleParseを介して実装された独自のソリューションを考え出しました。
ただし、いくつかのトークンには相互に含まれている可能性のある問題があり、それを行うための「正しい」方法がわかりません。
これが私の文法の一部です:
最初の問題は、スポイラー、ストロング、エンファシスが任意の順序でお互いを含めることができるということです。そして、後でそのようなインラインマークアップがさらに必要になる可能性があります。
私の現在の解決策は、組み合わせ(inline_noast、inline_nostrongなど)ごとに個別のトークンを作成することですが、明らかに、そのような組み合わせの数は、マークアップ要素の数が増えるにつれて急速に増えます。
__._.__*__.__...___._.____.__**___***
2番目の問題は、強い/強調されたこれらの先読みは、 (ランダムに配置されたマークアップシンボルがたくさんある)のような悪いマークアップのいくつかのケースで非常にうまく動作しないことです。そのようなランダムなテキストの数kbを解析するのに数分かかります。
文法に問題がありますか、それともこのタスクに他の種類のパーサーを使用する必要がありますか?