===========================================================================
■ コードネーム "KIU" 〜雨ニモ負ケズ、風ニモ負ケズ〜 Version 0.4.6
===========================================================================

＞●喜雨　悔いあらためてください(￣▽￣) 

///////////////////////////////////////////////////////////////////////////

文法仕様です。いい感じに肥大化しています。

なお、単語のデリミタで若干嘘が混じっています。
空白が1つ以上要求される場所にWSを使っているケースです。
良きに計らってください。

///////////////////////////////////////////////////////////////////////////

EBNF簡略解説

■0回以上の繰り返し
'*'で表す。
ex)
Sentence ::= Token *

■1回以上の繰り返し
'+'で表す。
ex)
TokenGroup ::= Token +

■文字、文字列
文字や文字列は''で囲む。また、文字は#xで始まるWideCharacter表記でも良い。
ex)
Group ::= '(' Part-word * ')'
S ::= (#x20 |#x9 |#xd |#xa)+

■文字範囲
('a'|'b'|'c'|'d'|'e') は '[abcde]'と書け、'[a-e]'とも書ける。
[#x20-#x07FF]などという表記も可。
基本的に2byte文字を想定しているが、多バイト文字でもよい。
その場合は適時文字範囲を拡張して考えること。

■例外
'-'で表す。(Char - '/')は、'/'を除くCharを表す。

■文字範囲の除外
[]内の先頭の'^'は、この文字範囲が除外されることを表す。
[^a-d]は、[a-d]以外の文字を表す。

■コメント
'#'以降はコメントとする。#xXX表記と紛らわしい。

///////////////////////////////////////////////////////////////////////////

"KIU" プリプロセッサ

[0] 行が'!'で始まる場合、暗号化された行として、復号処理を行う。

[1] 行頭に':'がある場合、その行はプラグマとして扱われる。

  ・':rem' : ':endrem'までの間の行をコメントとして扱う。
  ・認識できないプラグマは素通りする

[2] 行頭から空白文字以外の最初の文字が'#'であった場合、その行は
コメントとして破棄される。


現実的には、ゾーン切替の処理もこの段階で行うことになる。

///////////////////////////////////////////////////////////////////////////

"KIU" 辞書文法 / 恐らくフルセット

■辞書

[0] <辞書> [GOAL]
Dictionary ::=
	DictionaryDecl

[1] <辞書記述ゾーン>
DictionaryDeclZone ::=
	'=dict' R DictionaryDecl '=end' R

[2] <スクリプト記述ゾーン>
ScriptDeclZone ::=
	'=kis' R ScriptDecl '=end' R

[3] <辞書記述>
DictionaryDecl ::=
	( EntryDef | ScriptDeclZone ) *

[4] <スクリプト記述>
ScriptDecl ::=
	( ScriptStatementSeq | DictionaryDeclZone ) *

[5] <エントリ定義>
EntryDef ::=
	WS EntryIdList ':' S NRStatementList R
	| WS EntryIdList '(' WS StatementList ')'

[6] <エントリ識別子並び>
EntryIdList ::=
	IdLiteral S | IdLiteral S ',' S EntryIdList

[7] <改行不可文並び>
NRStatementList ::=
	NRStatement S | NRStatement S ',' S NRStatementList
	# No Return Statement List

[8] <文並び>
StatementList ::=
	Statement WS | Statement WS ',' WS StatementList

■文

[9] <改行不可文>
NRStatement ::=
	S ( Word.mode1 S ) *
	# No Return Statement

[10] <ブロック>
Block ::=
	'(' WS Statement ')'

[11] <文>
Statement ::=
	WS ( Word.mode3 WS ) *

[12] <単語>
Word.(mode) ::=
	( Literal.(mode) | Block | Subst ) +
	# NO Whitespace!

[13] <置換ブロック>
Subst ::=
	EntryCallSubst | EntryIndexSubst | InlineScriptSubst | ExprSubst

[14] <エントリ呼び出し>
EntryCallSubst ::=
	'${' WS EntryExpr '}'

[15] <エントリ配列呼び出し>
EntryIndexSubst ::=
	'$' EntryWord '[' WS Expression WS ']'
	# NO Whitespace

[16] <インラインスクリプトブロック>
InlineScriptSubst ::=
	'$(' WS ScriptStatementSeq WS ')'

[17] <インラインスクリプト文並び>
ScriptStatementSeq ::=
	Statement WS ( ';' WS ScriptStatement ) *

[18] <インラインスクリプト文>
ScriptStatement ::=
	WS ( Word.mode2 WS ) *

[19] <式呼び出し>
ExprSubst ::=
	'$[' WS Expression ']'


■エントリ演算式

[20] <エントリ演算式>
EntryExpr ::=
	EntryFactor ( WS EntryBinaryOp WS EntryFactor ) *

[21] <エントリ要素>
EntryFactor ::=
	EntryWord WS
	| '(' WS EntryExpr ')' WS

[22] <エントリ名>
EntryWord ::=
	( IdLiteral | Subst ) + WS


■式

[23] <式>
Expression ::=
	UnaryExpr ( WS BinaryOp WS UnaryExpr ) *

[24] <単項式>
UnaryExpr ::=
	ExprFactor
	| UnaryOp WS ExprFactor

[25] <要素>
ExprFactor ::=
	ExprWord
	| '(' Expression ')' WS

[26] <Expr単語>
ExprWord ::=
	( DecimalLiteral | QuotedLiteral | Subst ) + WS


■終端記号群

# <空白文字>
SC ::=
	#x20 | #x09
	# ' ' と '\t'

S ::=
	SC*

# <改行>
R ::=
	#x0D | #x0A | #x0d#x0A

# <空白>
WS ::=
	( SC | R ) *

# <識別子文字列>
IdLiteral ::=
	( [0-9A-Za-z._@?] | NAChar ) +

# <文字列>
Literal.(mode) ::=
	BareLiteral.(mode) | QuotedLiteral

# <ベア文字列>
BareLiteral.mode1 ::=
	( [#x21-#x7E] - ["$'(),] | NAChar ) +
	# = [A-Za-z0-9_!<>{}[]\%#&@?~:;./*+-=|^`] | NAChar

BareLiteral.mode2 ::=
	( [#x21-#x7E] - ["$'();] | NAChar ) +
	# = [A-Za-z0-9_!<>{}[]\%#&@?~:.,/*+-=|^`] | NAChar

BareLiteral.mode3 ::=
	( [#x21-#x7E] - ["$'()] | NAChar ) +
	# = [A-Za-z0-9_!<>{}[]\%#&@?~:;.,/*+-=|^`] | NAChar

	# * No Whitesapce!! *

# <クォート文字列>
QuotedLiteral ::=
	  "'" ([^'#x0D#x0A] | '\\' | "\'")* "'"
	| '"' ([^"#x0D#x0A] | '\\' | '\"')* '"'

# <10進整数文字列>
DecimalLiteral ::=
	'0'
	| [1-9] [0-9]*

# <非ASCII文字>
NAChar ::=
	[#x0080-#xFFFF]
	# Non ASCII Character

# <エントリ二項演算子>
EntryBinaryOp ::=
	'+' | '-' | '&'

# <二項演算子>
BinaryOp ::=
	'|' | '&' | '^'
	| '||' | '&&' 
	| '<' | '<=' | '=' | '==' | '!=' | '=~' | '!~' | '>=' | '>'
	| '+' | '-' | '*' | '/' | '%' | '**'

# <単項演算子>
UnaryOp ::=
	'-' | '+' | '!' | '~'


///////////////////////////////////////////////////////////////////////////

ChangeLog :
0.4.5 -> 0.4.6
	完全複数行エントリ定義を追加。

0.4.4 -> 0.4.5
	この期に及んで、スクリプトの単語中に';'が使えるようなバグを発見。
	この際ということでベア文字列をモード分け。

0.4.3 -> 0.4.4
	式中のQuotedLiteralは必須。エンバグしました。すみません。

0.4.2 -> 0.4.3
	Entry名の扱いを厳密化。
	ついでに式中のQuotedLiteralも禁止。
	QuotedLiteralの使える場所が分かりやすくなった。

0.4.1b -> 0.4.2
	EntryNameをEntryWordに統一
	EntryNameListをEntryDeclListに統一
	エントリ名にQuotedLiteralが入っていたバグを修正

0.4.0b -> 0.4.1b
	式中の単語についてbug fix
	Word/WeakWord導入

0.3.0b -> 0.4.0b
	マッチエントリ削除。
	=dict, =kisゾーン導入。
	lexerに関するメモを削除。

0.2.5b -> 0.3.0b
	エントリ定義を、通常のものとマッチエントリとで統一。
	各演算式構文表記の簡略化し、動作については別記とした。
	Expressionの定義の追加。
	演算式の単語にBlockが入っていたバグを修正。

0.2.4b -> 0.2.5b
	マッチ演算子の内、','を「弱論理積演算子」とした。WSの位置を最適化。
	EntryIndexSubstを正式に分離した。

0.2.3b -> 0.2.4b
	Lexerの動作を修正。置換の特別扱いを廃止。

0.2.2b -> 0.2.3b
	Exprについての記述を若干追加。空白を見逃していた。

0.2.1b -> 0.2.2b
	添え字の扱いがlexerレベルに落ちていた("[0-9]+"などとふざけた記述に
	なっていた)のを、Expr相当としたので、簡易版ながらExprの定義を追加。

0.2.0b -> 0.2.1b
	添え字付きエントリ呼び出しについての記述が抜けていた。

0.1.1b -> 0.2.0b
	preprocessorとlexerについての記述を追加。

0.1.0b -> 0.1.1b
	QuotedLiteralのbug fix.

