C XML的形式语法

C XML的形式语法,c,xml,grammar,formal-languages,C,Xml,Grammar,Formal Languages,我正试图用C语言为XML文件构建一个小型解析器。我知道,我可以找到一些完成的解决方案,但我只需要一些嵌入式项目的基本资料。我试图创建语法来描述没有属性的XML,只是标记,但它似乎不起作用,我也不知道为什么 以下是语法: XML : FIRST_TAG NIZ NIZ : VAL NIZ | eps VAL : START VAL END | STR | eps 下面是实现此语法的部分C代码: void check() { getSymbol(); if(

我正试图用C语言为XML文件构建一个小型解析器。我知道,我可以找到一些完成的解决方案,但我只需要一些嵌入式项目的基本资料。我试图创建语法来描述没有属性的XML,只是标记,但它似乎不起作用,我也不知道为什么

以下是语法:

   XML : FIRST_TAG NIZ
   NIZ : VAL NIZ | eps
   VAL : START VAL END
     | STR
     | eps
下面是实现此语法的部分C代码:

void check() {

getSymbol();
if( sym == FIRST_LINE )
{
    niz();
}
else {
    printf("FIRST_LINE EXPECTED");
    exit(1);
 }
}

 void niz() {
getSymbol();
if( sym == ERROR )
    return;
if( sym == START ) {
    back = 1;
    val();
    niz();
}
printf(" EPS OR START EXPECTED\n");

}

void val() {
getSymbol();
if( sym == ERROR )
    return;
if( sym == START ) {
    back = 0;

    val();
    getSymbol();
    if( sym != END ) {
        printf("END EXPECTED");
        exit(1);
    }
    return;
}
if( sym == EMPTY_TAG || sym == STR)
    return;
printf("START, STR, EMPTY_TAG OR EPS EXPECTED\n");
exit(1);
}

编辑:以下是不符合此语法的XML文件示例:

<?xml version="1.0"?> 
<VATCHANGES> 
<DATE>15/08/2012</DATE>
<TIME>1452</TIME>
<EFDSERIAL>01KE000001</EFDSERIAL> 
<CHANGENUM>1</CHANGENUM> 
<VATRATE>A</VATRATE> 
<FROMVALUE>16.00</FROMVALUE> 
<TOVALUE>18.00</TOVALUE> 
<VATRATE>B</VATRATE> 
<FROMVALUE>2.00</FROMVALUE> 
<TOVALUE>0.00</TOVALUE> 
<VATRATE>C</VATRATE> 
<FROMVALUE>5.00</FROMVALUE> 
<TOVALUE>0.00</TOVALUE> 
<DATE>25/05/2010</DATE> 
<CHANGENUM>2</CHANGENUM> 
<VATRATE>C</VATRATE> 
<FROMVALUE>0.00</FROMVALUE> 
<TOVALUE>4.00</TOVALUE> 
</VATCHANGES> 

15/08/2012
1452
01KE000001
1.
A.
16
18
B
2
0
C
5
0
25/05/2010 
2.
C
0
4

它在输出端给出预期的结束

首先,你的语法需要改进。假设前导正确处理,则NIZ的定义中存在一个基本错误

NIZ : VAL NIZ | eps
VAL : START VAL END
    | STR
    | eps
所以我们进入NIZ,首先寻找VAL。问题在于VAL可能的生产和NIZ结束时的eps。因此,如果VAL不生产任何东西(即eps)并且在过程中不消耗任何代币(因为eps是生产过程,所以这是不正确的),NIZ将减少到:

NIZ: eps NIZ | eps
这不好

考虑一下这些方面的问题:我只是在没有真正远见的情况下说出了这一点,而不仅仅是一个纯粹的基本结构

XML:         START_LINE ELEMENT
ELEMENT:     OPENTAG BODY CLOSETAG
OPENTAG:     lt id(n) gt
CLOSETAG:    lt fs id(n) gt
BODY:        ELEMENT | VALUE
VALUE:       str | eps
这是超基本的。终端包括:

lt:    '<'
gt:    '>'
fs:    '/'
str:   any alphanumeric string excluding chars lt or gt.
id(n): any alphanumeric string excluding chars lt, gt, or fs. 
lt:'
财政司司长:‘/’
str:任何字母数字字符串,不包括字符lt或gt。
id(n):任何字母数字字符串,不包括字符lt、gt或fs。
我现在几乎可以感受到XML纯粹主义者的愤怒,但我想说的是,当语法定义良好时,RDP会自己编写。显然,lexer(即令牌引擎)需要相应地处理终端。注意:id(n)是一个id堆栈,用于确保正确关闭最里面的标记,并且是解析器的一个属性,与解析器管理标记id的方式一致。它不是传统的,但它使事情变得容易得多

这显然可以/应该扩展到包括独立元素声明和快捷元素闭包。例如,此语法允许此形式的元素:

<ElementName>...</ElementName>
<ElementName/>
。。。
但不是这种形式:

<ElementName>...</ElementName>
<ElementName/>

也不考虑快捷终止,例如:

<ElementName>...</>
。。。
考虑这些添加显然会使语法相当复杂,但也会使解析器更加健壮。正如我所说的,上面的例子基本上是一个Basic B。如果你真的要着手研究这一点,那么在设计你的语法时,你要考虑的事情,因此也是你的RDP。


不管怎样,想想你语法中的一些改写会大大降低你的难度。

< P>首先,你的语法需要一些工作。假设前导正确处理,则NIZ的定义中存在一个基本错误

NIZ : VAL NIZ | eps
VAL : START VAL END
    | STR
    | eps
所以我们进入NIZ,首先寻找VAL。问题在于VAL可能的生产和NIZ结束时的eps。因此,如果VAL不生产任何东西(即eps)并且在过程中不消耗任何代币(因为eps是生产过程,所以这是不正确的),NIZ将减少到:

NIZ: eps NIZ | eps
这不好

考虑一下这些方面的问题:我只是在没有真正远见的情况下说出了这一点,而不仅仅是一个纯粹的基本结构

XML:         START_LINE ELEMENT
ELEMENT:     OPENTAG BODY CLOSETAG
OPENTAG:     lt id(n) gt
CLOSETAG:    lt fs id(n) gt
BODY:        ELEMENT | VALUE
VALUE:       str | eps
这是超基本的。终端包括:

lt:    '<'
gt:    '>'
fs:    '/'
str:   any alphanumeric string excluding chars lt or gt.
id(n): any alphanumeric string excluding chars lt, gt, or fs. 
lt:'
财政司司长:‘/’
str:任何字母数字字符串,不包括字符lt或gt。
id(n):任何字母数字字符串,不包括字符lt、gt或fs。
我现在几乎可以感受到XML纯粹主义者的愤怒,但我想说的是,当语法定义良好时,RDP会自己编写。显然,lexer(即令牌引擎)需要相应地处理终端。注意:id(n)是一个id堆栈,用于确保正确关闭最里面的标记,并且是解析器的一个属性,与解析器管理标记id的方式一致。它不是传统的,但它使事情变得容易得多

这显然可以/应该扩展到包括独立元素声明和快捷元素闭包。例如,此语法允许此形式的元素:

<ElementName>...</ElementName>
<ElementName/>
。。。
但不是这种形式:

<ElementName>...</ElementName>
<ElementName/>

也不考虑快捷终止,例如:

<ElementName>...</>
。。。
考虑这些添加显然会使语法相当复杂,但也会使解析器更加健壮。正如我所说的,上面的例子基本上是一个Basic B。如果你真的要着手研究这一点,那么在设计你的语法时,你要考虑的事情,因此也是你的RDP。


<> P>无论如何,想想你的语法中的一些改写会对你造成什么样的影响。

“看来它不起作用”——请给出一个例子(输入、输出、预期输出)是给你的语法还是把它作为开发的一部分?我这样问是因为它直接影响到你解决问题的灵活性。语法是在开发过程中产生的:“它似乎不起作用”-请举例说明(输入、输出、预期输出)语法是提供给你的还是在开发过程中产生的?我这样问是因为它直接影响到解决问题的灵活性。语法是在开发过程中产生的。这是:谢谢您的回答,还有一个问题,您的语法不适用于包含元素数组的xml文件,因此我对其进行了更改,但只想检查语法是否正确,或者我的编码是否错误。语法:XML:第一行数组;数组:元素ARRAYP;ARRAYP:ARRAY | EPS;元素:OPENTAG BODY CLOSETAG;BODY:ARRAY | EPSIf by ARRAY你指的是相同顺序的连续元素,你是正确的,因为上面公认的简单示例没有考虑它们。注释格式对阅读您提议的th会计没有多大帮助