0

次のような順序付きリストを解析したい:

I - Something
II - Something else...
IX - Something weird
XIII - etc

これまでのところ、私のツリートップ文法は次のとおりです。

rule text
    roman_numeral separator text newline
end

rule roman_numeral
    &. ('MMM' / 'MM' / 'M')? (('C' [DM]) / 
    ('D'? ('CCC' / 'CC' / 'C')?))? (('X' [LC]) / 
    ('L'? ('XXX' / 'XX' / 'X')?))? (('I' [VX]) / 
    ('V'? ('III' / 'II' / 'I')?))?
end

rule separator
    [\s] "-" [\s]
end

rule text
    (!"\n" .)*
end

rule newline
    ["\n"]
end

ただし、対応するパーサーはテキストを解析できません。何が壊れていますか?

4

1 に答える 1

3

誤って をオーバーロードしtextました。最初の名前を に変更しline、別のルールを に追加しlinesます。

改行を囲む引用符も不要のようです。

副次的なヒント - ルールを再利用して、newlineルールtextを DRY に保つことができます。

grammar Roman

  rule lines
    line*
  end

  rule line
    roman_numeral separator text newline
  end

  rule roman_numeral
    &. ('MMM' / 'MM' / 'M')? (('C' [DM]) /
    ('D'? ('CCC' / 'CC' / 'C')?))? (('X' [LC]) /
    ('L'? ('XXX' / 'XX' / 'X')?))? (('I' [VX]) /
    ('V'? ('III' / 'II' / 'I')?))?
  end

  rule separator
    [\s] "-" [\s]
  end

  rule text
    (!newline .)*
  end

  rule newline
    [\n]
  end

end

アップデート

否定先読みと単一文字クラスを削除することで、文法を少し単純化できます。

rule separator
  " - "
end

rule text
  [^\n]*
end

結果の構文グラフは、はるかに単純になります。

于 2013-07-10T01:32:59.040 に答える