XML грамматика для OkudaKit - PullRequest
       25

XML грамматика для OkudaKit

2 голосов
/ 29 октября 2011

Я пытаюсь написать грамматику XML для OkudaKit.Я заметил, что связанная грамматика HTML работает для простого XML, но не работает с элементами или атрибутами пространства имен, поэтому первое, что я хочу сделать, это добавить их поддержку.Используя грамматику HTML в качестве шаблона, я определил ns, а затем добавил его к tagName и attrName:

@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

Iм интерпретирую "?"означать «необязательно», но я думаю, что это неправильно.Я не нашел его в руководстве по грамматике ParseKit .

1 Ответ

4 голосов
/ 05 ноября 2011

Разработчик OkudaKit / ParseKit здесь. Я исправил проблему с корнем, которая вызвала проблему, с которой вы столкнулись.

Моя грамматика HTML OkudaKit не поддерживала CDATA или QNames. Я улучшил грамматику HTML в репозитории OkudaKit SVN (в транке). Пожалуйста, обновите вашу рабочую копию, и вы увидите исправление. Теперь HTML-грамматика должна отвечать вашим потребностям (дайте мне знать, если у вас возникнут проблемы).

Две последние вещи / уловки, о которых нужно помнить (о которых я сам забыл):

  1. Грамматические произведения, для которых вы определяете правила CSS ДОЛЖНЫ be Terminal Grammar Productions.

    Вот несколько примеров Teminal Productions (подсказка: они не указывают на другие нетерминальные произведения):

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

    Это , а не Terminal Productions:

    qName = qualifiedName | unqualifiedName;
    @start = any*;
    
  2. ALL Terminal Productions в вашей грамматике MUST имеют правила CSS, определенные в файле CSS.

Причина, по которой ваша первая попытка исправить это не сработала, заключается в том, что вы не соблюдали два правила выше. Если вы не будете следовать этим двум правилам, вывод будет странным образом переупорядочен / переупорядочен.

Очень жаль, я знаю, что эта информация нигде не включена в OkudaKit, так что вы никак не могли об этом знать. Я постараюсь исправить это в будущем.

...