2
  • 空白と改行を通常の空白と見なしたい。
  • 改行を他の空白と区別し、特殊なケースを許可したい。

準拠した文法を書く最初の試みは失敗します。

文法は次のとおりです。

! ------------------------------------------------- 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}
4

3 に答える 3

5

どちらも同じサブセットを含むため、あいまいです{CR}{LF} | {CR} | {LF}

入力が与えられると{CR}{LF}、パーサーはどの端末と一致するかを判断する方法がありません。

テーブル駆動パーサーは、実際には「特殊なケース」を直接処理するようには設計されていません。あるコンテキストでは改行を無視したいが、他のコンテキストではそれらに意味を与えたい場合は、リダクションでそれを処理する必要があります (つまり、改行を個別にトークン化し、リダクションでそれらを破棄します)。 .

(潜在的に) より良い解決策は、トークナイザーの状態 (おそらくパーサーから制御される) を使用して、改行入力のトークン化方法を変更することです。文法を完全に理解していないと言うのは難しい. さらに、私がこのようなものを台無しにしてから数年が経ちました.

于 2009-03-01T07:49:41.443 に答える
4

Whitespace と MyNewLine の両方が改行文字に一致するという意味で、文法があいまいであると思います。あなたのやり方でぐらつくので、空白と改行を別々に検出し、ケースバイケースで改行をどうするかを決めることをお勧めします。

私はこの分野ではあまり経験がありませんが、計算理論のクラスとコンパイラ設計のクラスで覚えていることです。

これが役立つことを願っています。

于 2009-03-01T07:21:31.137 に答える
0

遅い答え。

残念なことに、私は最近の遅咲きのメンバーです ;-)。

通常の行ベースの文法宣言を使い続ける

! ====================================================================
{Whitespace Ch} = {Whitespace} - {CR} - {LF}

Whitespace = {Whitespace Ch}+
Newline    = {CR}{LF} | {CR} | {LF}
! ====================================================================

空白と改行の区別はすでに考慮されています!

プロダクション ルールを作成するときは、特殊なケースに対処することを検討してください。

複雑なケースでは、いくつかの仮想端末を定義する必要さえあるかもしれません (高度なテクニック)。

文法を詳しく説明し、もう一度投稿して質問することができます。

最終編集: 既に問題に対処している場合は、共有してください。ありがとう。

于 2011-12-07T06:21:08.270 に答える