2

OkudaKitのXML文法を書こうとしています。バンドルされたHTML文法は単純なXMLで機能しますが、名前空間の要素または属性では失敗することに気付きました。そのため、最初に実行したいのは、これらのサポートを追加することです。HTML文法をテンプレートとして使用して、nsそれを定義してから追加しましtagNameattrName

@multiLineComments = '<!--' '-->';
@commentState = '<';
@commentState.fallbackState = delimitState;

@delimitedString = '<?' '?>' nil;
@delimitedString = '<!DOCTYPE' '>' nil;
@delimitState.fallbackState = symbolState;

@start          = any*;
any             = element | text | doctype | pi | comment;

pi              = DelimitedString('<?', '?>');

doctype         = DelimitedString('<!DOCTYPE', '>');
element         = emptyTag | startTag elementContent* endTag;
elementContent  = element | text | comment | pi;
text            = /[^<]+/;

emptyTag        = lt tagName attr* fwdSlash gt;
startTag        = lt junk? tagName attr* gt;
endTag          = lt fwdSlash tagName gt;

ns              = Word colon;

tagName         = ns? Word;

attr            = attrName eq attrValue;
attrName        = ns? Word;
attrValue       = QuotedString;

eq              = '=';
lt              = '<';
gt              = '>';
fwdSlash        = '/';
colon           = ':';

comment         = Comment;

動作するはずですが(「?」を正しく理解していれば、おそらく理解できません)、出力が混乱しています。以下は私のテストドキュメントです:

<?xml version="1.0" encoding="utf-8"?>
<test cats:dogs="television">
    <peas vegetable="box" >
        <orange />
        <!-- the following makes no sense -->
        <blue lion:mouse="cold"/>
        <red car:desk="apple">
            < envelope></ envelope>
            <![CDATA[lorem ipsum]]>
            <dwarves>
                <dwarf>Sleepy</dwarf>
                <dwarf>Dopey</dwarf>
            </dwarves>
        </red>
    </peas>
</test>

そして、これは私の壊れた文法がそれを壊した後のように見えます(フォーマットを無視してください、それはNSXMLDocumentのきれいな印刷です):

<?xml version="1.0" encoding="utf-8"?>
< :cats=dogstest"television">
    < =vegetable"box"peas>
        <>orange</>orange
        <!-- the following makes no sense -->
        < :lion=mouseblue"cold"></>blue
        < :car=deskred"apple">&lt; envelope>&lt;/ envelope> lorem ipsum<>dwarves
                <>dwarfSleepy</>dwarf
                <>dwarfDopey</>dwarf
            </>dwarves
        </>red
    </>peas
</>test

私は「?」を解釈しています 「オプション」を意味しますが、それは間違っていると思います。ParseKit文法ガイドでカバーされていることがわかりませんでした。

4

1 に答える 1

4

OkudaKit/ParseKit の開発者はこちら。あなたが遭遇した問題の原因となった根本的な問題を修正しました。

私の OkudaKit HTML 文法は、CDATA または QNames をサポートしていませんでした。OkudaKit SVN リポジトリ (トランク内) の HTML 文法を強化しました。作業コピーを更新してください。修正が表示されます。HTML 文法がニーズを満たすはずです (問題が発生した場合はお知らせください)。

覚えておくべき最後の2つのこと/トリック(私は自分自身を忘れていました):

  1. CSS ルールを定義する Grammar Productionsは、 Terminal Grammar Productions でなければなりません。

    以下は、ターミナル プロダクションの例です (ヒント: 他の非ターミナル プロダクションを指しているわけではありません)。

    colon = ':';
    prefix = Word;
    comment = Comment;
    

    これらはターミナル プロダクションではありません。

    qName = qualifiedName | unqualifiedName;
    @start = any*;
    
  2. Grammar 内のすべての Terminal Productions には、CSS ファイルで CSS ルールが定義されている必要があります

最初の修正の試みがうまくいかなかった理由は、上記の 2 つのルールを尊重していなかったからです。これらの 2 つのルールに従わない場合、出力は奇妙な方法で中断/並べ替えられます。

大変申し訳ありませんが、この情報は OkudaKit のどこにも含まれていないことを知っているので、知る由もありません。私は将来それを修正しようとします。

于 2011-11-04T22:42:06.223 に答える