第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を用意します。
2.WORDトークンLITERALトークン | ('"' [ˆ"]* '"') | ("'" [ˆ']* "'") |
本コラムでの表現 | LITERAL ('文字パターン') |
EBNFデータツリーの表現 | EbnfLimitedLiteralNode |
WORDトークンに対して特定の文字パターンを指定する:EbnfLimitedWordNodeを用意します。
3.SYMBOLトークンWORDトークン | [ˆ<&]* − ([ˆ<&]* ']]>' [ˆ<&]*) |
本コラムでの表現 | WORD ('文字パターン') |
EBNFデータツリーの表現 | EbnfLimitedWordNode |
SYMBOLトークンに対して特定の文字列を指定する:EbnfSymbolNodeを用意します。
4.WHITE_SPACEトークンSYMBOLトークン | 記号の集合 |
本コラムでの表現 | SYMBOL ('文字列') |
EBNFデータツリーの表現 | EbnfSymbolNode |
WHITE_SPACEトークンとして、:EbnfWhiteSpaceNodeを用意します。
さらに、WHITE_SPACEトークンはSとRepetitionを混合したS?が頻出するため
S?: EbnfSQuestionNode
を用意します。
また、本来出現しないはずのS*とS+は今後の構文の変形の中で出現することになりますので別途用意します。
S*: EbnfSAsterRepetitionNode
S+: EbnfSPlusNode
WHITE_SPACEトークン | 空白 |
本コラムでの表現 | S |
EBNFデータツリーの表現 | EbnfWhiteSpaceNode |
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]| [#x37F−#x1FFF] | [#x200C−#x200D]
| [#x2070−#x218F] | [#x2C00−#x2FEF]
| [#x3001−#xD7FF] | [#xF900−#xFDCF]
| [#xFDF0−#xFFFD] | [#x10000−#xEFFFF]
| #xB7 | [#x0300−#x036F] | [#x203F−#x2040]
[13] PubidChar::= #x20 | #xD | #xA | [a−zA−Z0−9]
| [−'()+,./:=?;!*#@$_%]
[81] EncName ::= [A−Za−z] ([A−Za−z0−9._] | '−')*コメント
コメントを投稿する
SpecialPR