本家「@IT」にはない内容をエンジニアライフで技術紹介するコラム。広く議論する場になることを目指します。

第014回_構文の整理1_基底

»

EBNFデータツリーにて構文を実装するための整理と表現力の拡張

Sample実装1~4 の AnalyzeSyntax()において、構文をEbnfXXXXXNodeの組合せで表現しました。しかし、XMLの構文は数が多く全てを1箇所で実装するとメンテが大変です。また、読みやすさを重視してLL (1)でない構文もあり、そのままでは実装できませんので構文を整理します。
また、今後の実装に備えてEBNF構文の表現を拡張します。

EBNF構文と対応するEBNFデータツリーの基本クラスの扱い

EBNF構文の連接、繰り返し、選択について(はSampleで説明済みですが、一応)説明します。

連接
EBNFデータツリーの連接は、EbnfSequenceNodeを使って表現します。ただし、EBNF構文が読みにくくなるので表記上は特に明記しません。
連接A B Cを左から順に処理する
本コラムでの表現A B C
EBNFデータツリーの表現EbnfSequenceNodeの子ノード A,B,C

繰り返し
EBNFデータツリーの繰り返しは、EbnfRepetitionNodeを使って表現し、EBNF構文の繰り返しに対応します。
繰り返しAを繰り返す
本コラムでの表現A*、A+、A?、A{x,y}
EBNFデータツリーの表現EbnfRepetitionNodeの子ノード A、繰り返す回数は上限値と下限値で指定する

選択
EBNFデータツリーの選択は、EbnfAlternativeNodeを使って表現し、EBNF構文の | のグループに対応します。
選択AとBとCとDから選択する
本コラムでの表現A | B | C | D
EBNFデータツリーの表現EbnfAlternativeNodeの子ノード A,B,C,D

EBNF構文と対応するEBNFデータツリーの拡張クラスの定義

EBNF構文の*,+,?については、
 *:EbnfAsterRepetitionNode
 +:EbnfPlusRepetitionNode
 ?:EbnfQuestionNode
を用意します。

拡張EBNF構文とトークンのクラスの定義

次の4つのトークンについては補助的な機能を用意し、EBNF構文上も対応の表現を用意します。

1.LITERALトークン
LITERALトークンに対して特定の文字パターンを指定する:EbnfLimitedLiteralNodeを用意します。
LITERALトークン('"' [ˆ"]* '"') | ("'" [ˆ']* "'")
本コラムでの表現LITERAL ('文字パターン')
EBNFデータツリーの表現EbnfLimitedLiteralNode

2.WORDトークン
WORDトークンに対して特定の文字パターンを指定する:EbnfLimitedWordNodeを用意します。
WORDトークン[ˆ<&]* − ([ˆ<&]* ']]>' [ˆ<&]*)
本コラムでの表現WORD ('文字パターン')
EBNFデータツリーの表現EbnfLimitedWordNode

3.SYMBOLトークン
SYMBOLトークンに対して特定の文字列を指定する:EbnfSymbolNodeを用意します。
SYMBOLトークン記号の集合
本コラムでの表現SYMBOL ('文字列')
EBNFデータツリーの表現EbnfSymbolNode

4.WHITE_SPACEトークン
WHITE_SPACEトークンとして、:EbnfWhiteSpaceNodeを用意します。
WHITE_SPACEトークン空白
本コラムでの表現S
EBNFデータツリーの表現EbnfWhiteSpaceNode
さらに、WHITE_SPACEトークンはSとRepetitionを混合したS?が頻出するため
 S?: EbnfSQuestionNode
を用意します。
また、本来出現しないはずのS*とS+は今後の構文の変形の中で出現することになりますので別途用意します。
 S*: EbnfSAsterRepetitionNode
 S+: EbnfSPlusNode

XML構文にあってもEBNFデータツリーのクラスとして用意しないもの

以下の構文はWORDトークンの文字パターン(正規表現Patternに与える文字列)として表現します。
 [4] NameStartChar ::= ":" | [A−Z] | "_" | [a−z] | [#xC0−#xD6]
| [#xD8−#xF6] | [#xF8−#x2FF] | [#x370−#x37D]
| [#x37F−#x1FFF] | [#x200C−#x200D]
| [#x2070−#x218F] | [#x2C00−#x2FEF]
| [#x3001−#xD7FF] | [#xF900−#xFDCF]
| [#xFDF0−#xFFFD] | [#x10000−#xEFFFF]
 [4a] NameChar::= NameStartChar | "−" | "." | [0−9]
| #xB7 | [#x0300−#x036F] | [#x203F−#x2040]
 [13] PubidChar::= #x20 | #xD | #xA | [a−zA−Z0−9]
| [−'()+,./:=?;!*#@$_%]
 [81] EncName ::= [A−Za−z] ([A−Za−z0−9._] | '−')*
Comment(0)

コメント

コメントを投稿する