BNF文法+ゴールドLALRパーサーの破綻と区別する特別な場合には改行からの空白文字
-
11-09-2019 - |
質問
- 考えてみたいに空白や改行として通常の空白.
- たいと区別する改行は、他に空白まる。
初めての試み書き対応文法に失敗します。
ここでは、文法:
! ------------------------------------------------- Sets
{WS} = {Whitespace} - {CR} - {LF}
{ID Head} = {Letter} + [_]
{ID Tail} = {Alphanumeric} + [_]
{String Chars} = {Printable} + {HT} - ["\]
! ------------------------------------------------- Terminals
! The following defines the Whitespace terminal using the {WS}
! set - which excludes the carriage return and line feed
! characters
Whitespace = {WS}+ | {CR}{LF} | {CR} | {LF}
!NewLine = {CR}{LF} | {CR} | {LF}
MyNewLine = {CR}{LF} | {CR} | {LF}
解決
両者が同じサブセット{CR}{LF} | {CR} | {LF}
が含まれているので、彼らがあいまいです。
は、入力を考えると、パーサーは、それが一致している必要がありますどの端末伝える方法がない{CR}{LF}
ます。
テーブル駆動型のパーサは実際に直接、「特殊なケース」を扱うように設計されていません。あなたには、いくつかのコンテキストで改行を無視したいのですが、他の人にそれらに意味属性なら、あなたはあなたの削減にそれを処理する必要が(つまり、トークン化改行別に、そしてあなたの削減にそれらを捨てる)、それは醜い取得しますよます。
A(潜在的に)より良い解決策は、改行入力がトークン化された方法を変更するために、(おそらくパーサから制御)状態トークナイザを使用することです。それは完全にあなたの文法を理解せずに言うのは難しいです。私はこのようなものを台無してきたので、プラス、それは数年されています。
他のヒント
私は文法が空白とMyNewLineの両方が新しいラインcharachtersと一致するという意味で曖昧だと思います。それはそれをあなたの方法をやってグラグラがスローされますので、私は別に空白や改行を検出し、ケースバイケースで改行をどうするかを決めることをお勧めします。
私は、地域であまり経験がないが、私は計算クラスとコンパイラの設計クラスの私の理論から覚えているのthatsます。
私はこのことができます願っています。
遅いの答えです。
私は失望、私も最近のレbloomer;-)。
を用いておこないようにしても通常のラインに基づく文法の宣言
! ====================================================================
{Whitespace Ch} = {Whitespace} - {CR} - {LF}
Whitespace = {Whitespace Ch}+
Newline = {CR}{LF} | {CR} | {LF}
! ====================================================================
空白に対す改行を区別を取り込んでおり、新たにアカウントへ入金いたします。
検討の対応お客様の特別な場合を書く際に生産。
複雑な場合も必要に定義している仮想端子の先端技術).
い精巧なご依頼による掲示を設定することができます。
最終編集:ください、シェアがすでにみんなの問題です。感謝。