2009-03-01 3 views
2
  • 空白と改行を通常の空白と見なしたいと思います。
  • また、特別な場合を許可するために改行を他の空白と区別したいと思います。

準拠した文法を最初に作成しようとしても失敗します。ここでBNF文法+ゴールドLALRパーサー。特殊文字NewLineとホワイトスペースを区別できません。

は文法です:

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

答えて

5

両方とも同じサブセット{CR}{LF} | {CR} | {LF}を含んでいるため、あいまいです。

入力{CR}{LF}が与えられていると、パーサーは一致する端末を特定する方法がありません。

表駆動パーサーは実際には「特殊ケース」を直接処理するようには設計されていません。いくつかの文脈で改行を無視したいが、他の文脈でそれらに意味を付けるなら、あなたはそれをあなたの縮小で処理しなければならない(すなわち、改行を別々にトークン化し、あなたの縮小で破棄する) 。

(可能性として)よりよい解決策は、改行入力がどのようにトークン化されるかを変更するために、(おそらくパーサから制御される)トークナイザ状態を使用することです。あなたの文法を完全に理解していなくても、言うことは難しいです。加えて、私はこのことを混乱させてから数年が経ちました。

4

私は文法が空白とMyNewLineの両方が新しいラインcharachtersと一致するという意味で曖昧だと思います。それはあなたのやり方を揺るがすので、空白と改行を別々に検出し、改行をどうするかをケースバイケースで決めることをお勧めします。

私はこの分野であまり経験はありませんが、私のTheory of ComputationクラスとCompiler Designクラスから覚えていることがあります。

こちらがお役に立てば幸いです。

0

後半の回答。

私は残念ながら、最近のブルマーです.--)メンバーです。

は、改行の区別対通常のラインベースの文法宣言

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

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

空白がすでに考慮されている使用してください!

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

複雑な場合は、仮想端末(高度な技術)を定義する必要があります。

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

最後に編集:既に問題を解決していれば分かち合いましょう。ありがとう。

+0

私は本を拾い、gnu bison + gnu flexを使用しています。その素晴らしい。コンフリクトファイルの読み込みには熟練した学習曲線がありますが。 bison/flexの本は必須です。 –

+0

@ acidzombie24:Ok。あなたはゴールドパーサーを落としたのですか? – menjaraz

+0

はい。sdkvfsdngn –