4

bison/flex を使用して単純な xml パーサーを作成したいと考えています。検証、コメント、引数のみは必要ありません<tag>value</tag>は数値、文字列、またはその他のいずれか<tag>value</tag>です。

たとえば、次のようになります。

<div>
  <mul>
    <num>20</num>
    <add>
      <num>1</num>
      <num>5</num>
    </add>
  </mul>
  <id>test</id>
</div>

それが役に立てば、発生する可能性のあるすべてのタグの名前を知っています。特定のタグで保持できるサブタグの数を知っています。そのようなことをするバイソンパーサーを作成することは可能ですか:

- new Tag("num", 1)           // tag1
- new Tag("num", 5)           // tag2
- new Tag("add", tag1, tag2)  // tag3
- new Tag("num", 20)          // tag4
- new Tag("mul", tag4, tag3)
...
- root = top_tag

タグとサブタグの数:

  • 数値: 1 (値のみ)
  • str: 1 (値のみ)
  • 追加 | サブ | サブ | ムル | div: 2 (num | str | タグ、num | str | タグ)

上記のような AST を作成するための文法を教えていただけませんか?

4

2 に答える 2

5

あなたの要件では、 yaxシステムがうまく機能すると思います。README から:

yax プロジェクトの目標は、YACC (実際には Gnu Bison) を使用して XML ドキュメントを解析/処理できるようにすることです。

上記の目標を達成するための重要なソフトウェアは、XML ドキュメントから XML 字句トークン ストリームを生成できるライブラリを提供することです。

このストリームをラップして yylex() のインスタンスを作成し、トークンを Bison 文法に供給して XML ドキュメントを解析および処理できます。

ストリームに加えて Bison 文法を使用すると、少なくとも次の種類のアクティビティを実行できます。

  1. XML ドキュメントを検証し、
  2. XML ドキュメントを直接解析して、内部データ構造を作成します。
  3. DOM ツリーを構築します。
于 2012-08-16T16:35:31.840 に答える
2

xml パーサーを作成するのに最適なツールだとは思いません。この仕事をしなければならない場合は、手作業で行います。

Flex コードには : この例では NUM 一致整数が含まれます。STR は、'<' または '>' を含まない任意の文字列に一致します。STOP すべての終了タグに一致します。START マッチ開始タグ。

<\?.*\?> { ;} 
<[a-z]+> { return START; }
</[a-z]+> { return STOP; }
[0-9]+ { return NUM; }
[^><]+ { return STR; }

バイソンコードは次のようになります

%token START, STOP, STR, NUM
%%
simple_xml : START value STOP
;
value : simple_xml 
| STR
| NUM
| value simple_xml
;
于 2010-12-22T09:52:33.487 に答える