1

私は Yacc 記法で文法の断片を持っています:

stylesheet
: [ CHARSET_SYM STRING ';' ]?
  [S|CDO|CDC]* [ import [ CDO S* | CDC S* ]* ]*
  [ [ ruleset | media | page ] [ CDO S* | CDC S* ]* ]*
;

このフラグメントを Irony に実装するにはどうすればよいですか? に相当するものが見つかりません?。これは、Yacc で 0 または 1 回出現することを意味します。

4

2 に答える 2

2

メソッドを使用して「?」BnfTerm.Qを表すことができます。(0 または 1 回の発生)。やとは異なり、C# では演算子のカスタム実装を記述できないため、これは妥当な設計上の決定でした。?+*

Irony WikibookのNon Terminals ページから:

従来の BNF 表記では、「?」、「+」、および「*」文字は、それぞれ「0 回または 1 回」、「1 回以上」、および「0 回以上」を示すために使用されます。Irony では、少し異なる方法で行われます。基本 Grammar クラスの MakePlusRule メソッドと MakeStarRule メソッドを「+」と「*」に使用するか、Q()、Plus()、および Star() メソッドをルール内の用語に直接使用できます。

于 2014-05-27T09:56:22.317 に答える
1

著者は、この目的のために追加の AST ノードが必要になったと述べています。たとえば、ルールのオプションの用語を次のように置き換えることができます。

new NonTerminal("OptionalTermName", Empty | TermThatShouldBeOptional)

http://irony.codeplex.com/discussions/550979

次のように削減できるかどうか疑問に思います。

(Empty | TermThatShouldBeOptional)

オーバーロードは、非ターミナル ノードではなく BNF タームを作成します。実装によっては、他の BNF タームと直接結合すると、いくつかの階層情報が失われる可能性があります。詳しくは調べていません。

于 2014-12-19T18:26:13.343 に答える