我正在尝试为OkudaKit编写XML语法。我注意到捆绑的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">< envelope></ envelope> lorem ipsum<>dwarves
<>dwarfSleepy</>dwarf
<>dwarfDopey</>dwarf
</>dwarves
</>red
</>peas
</>test
我在解释“?”意思是“可选的”,但我认为这是错误的。我没有在ParseKit grammar guide中找到它。
答案 0 :(得分:4)
OkudaKit / ParseKit的开发者。我已经修复了导致你遇到问题的根问题。
我的OkudaKit HTML语法不支持CDATA或QNames。我已经在OkudaKit SVN仓库(在主干中)增强了HTML语法。请更新您的工作副本,您将看到修复程序。 HTML语法现在应该满足您的需求(如果您遇到问题,请告诉我)。
要记住的两件最后的事情/伎俩(我忘记了自己):
您为其定义CSS规则 必须 的Grammar Productions为终端语法制作。
以下是Teminal Productions的一些例子(暗示:他们没有指出其他非终端制作):
colon = ':';
prefix = Word;
comment = Comment;
这些不终端制作:
qName = qualifiedName | unqualifiedName;
@start = any*;
所有语法中的终端制作必须在CSS文件中定义了CSS规则。
您首次尝试修复不起作用的原因是您不遵守上述两条规则。当你不遵循这两个规则时,输出会以奇怪的方式被borked /重新排序。
非常抱歉,我知道这些信息不包含在OkudaKit的任何地方,所以你无法知道。我会在将来尝试解决这个问题。