; ルールの集合 rules ::= blank? rule (blank rule)* blank? ; バックトラックしないため,これは間違い → blank? (rule blank)* rule blank? ; ルールとルールの間のスペース blank ::= (#x09 | #x20 | BR)+ ; 1つのルール内におけるスペース S ::= (#x09 | #x20 | BR_continue)+ ; 1つのルール内における改行: 次の行はタブ文字で始まること BR_continue ::= BR #x09 ; 一般的な改行 BR ::= comment? (#x0D #x0A | #x0A | #x0D) ; コメント comment ::= ";" [^#x0A#x0D]* ; --- さてさて :-) --- ; ルール rule ::= rulename S? "::=" S? expression ; ルール名 rulename ::= id ; expressionはtermをor演算子でつないだもの expression ::= term (S? "|" S? term)* ; termはfactorの連続 term ::= factor (S factor)* ; factorはelementに例外elementを加えたもの factor ::= element (S? "-" S? element)? ; element は atom に量指定子をつけたもの element ::= atom [+*?]? ; atom はルール名,文字,文字列,カッコで囲んだ expression atom ::= rulename | literal | charclass | escaped | "(" S? expression S? ")" ; literalは <"> か <'> で囲んだ文字列で, ; <\> がエスケープ文字となる literal ::= d_literal | s_literal d_literal ::= '"' ([^"#x5c] | #x5c [#x20-#x7e])* '"' s_literal ::= "'" ([^'#x5c] | #x5c [#x20-#x7e])* "'" ; charclassは [...] あるいは [^...] ; 中に <\> <]> <-> は単独では入れられない.<\> でエスケープすること. charclass ::= "[" "^"? (alphanum alphanum_range? | escaped escaped_range? | [^\\\]\-] | #x5c [\\\]\-] )+ "]" id ::= alphabet (alphanum | "_")* alphabet ::= [a-zA-Z] number ::= [0-9] alphanum ::= alphabet | number alphanum_range ::= "-" alphanum escaped ::= "#x" hex hex (hex hex (hex hex)?)? escaped_range ::= "-" escaped hex ::= [0-9a-fA-F] ; 終わり