Syntax in EBNF for 1.0.3

このドキュメントでは、¬<><∪∪の文法を Input Specification よりも厳密に定義します。ゴール記号は Root です。この文法は、¬<><∪∪のソースファイルで使用されているものを基にしているため、終端・非終端記号の名前は Input Specification などで使用されているものとは異なります。? は省略可能、* は0回以上の繰り返しを表します。

終端記号

StringLiteral ::= <Javaの文字列リテラル>
CharacterLiteral ::= <Javaの文字リテラル>
IDENTIFIER ::= <Javaの識別子および予約語で、$で始まらないもの>

加えて、以下においてJavaの文字列リテラルの形式で表現される文字列も終端記号となります。また、次の文字列も終端記号となります。"||" "&&" "--" "!!" "**" "++" "??"

名前

TypeName ::= IDENTIFIER
SubtokenName ::= IDENTIFIER
SymbolName ::= IDENTIFIER

ゴール記号

Root ::= ParserDeclaration ConstructorScope? definition* "\u001A"?
ParserDeclaration ::= "$protected"? "$parser" JavaName ";"
JavaName ::= IDENTIFIER ( "." IDENTIFIER )*
ConstructorScope ::= "$protected" "$constructor" ";"
definition ::= SubtokenDefinition | TokenDefinition | WhiteTokenDefinition | TokenReservation | WhiteTokenReservation | TypeDefinition | AliasDefinition

字句解析器

SubtokenDefinition ::= "$subtoken" IDENTIFIER "=" tokenExpression ";"
TokenDefinition ::= "$token" IDENTIFIER "=" tokenExpression ";"
WhiteTokenDefinition ::= "$white" "$token" IDENTIFIER "=" tokenExpression ";"
TokenReservation ::= "$token" IDENTIFIER ";"
WhiteTokenReservation ::= "$white" "$token" IDENTIFIER ";"

tokenExpression ::= SelectiveTokenExpression
SelectiveTokenExpression ::= termTokenExpression ( "|" termTokenExpression )*
termTokenExpression ::= SequentialTokenExpression | IntersectionTokenExpression | DifferenceTokenExpression
IntersectionTokenExpression ::= termTokenExpression "&" SequentialTokenExpression
DifferenceTokenExpression ::= termTokenExpression "-" DifferenceTokenExpressionRHS
DifferenceTokenExpressionRHS ::= SequentialTokenExpression
SequentialTokenExpression ::= prefixTokenExpression*
prefixTokenExpression ::= postfixTokenExpression | ComplementaryTokenExpression
ComplementaryTokenExpression ::= "!" prefixTokenExpression
postfixTokenExpression ::= StarTokenExpression | PlusTokenExpression | OptionalTokenExpression1 | primaryTokenExpression
PlusTokenExpression ::= postfixTokenExpression "+"
StarTokenExpression ::= StarTokenExpressionConcrete EmptyTokenExpression
StarTokenExpressionConcrete ::= postfixTokenExpression "*"
OptionalTokenExpression1 ::= postfixTokenExpression "?" EmptyTokenExpression
EmptyTokenExpression ::= 
primaryTokenExpression ::= CharacterTokenExpression | CharacterRangeTokenExpression | StringTokenExpression | IdentifierTokenExpression | OptionalTokenExpression2 | parenthesizedTokenExpression
CharacterTokenExpression ::= CharacterLiteral
CharacterRangeTokenExpression ::= CharacterLiteral ".." CharacterLiteral
StringTokenExpression ::= StringLiteral
IdentifierTokenExpression ::= SubtokenName
OptionalTokenExpression2 ::= "[" tokenExpression "]" EmptyTokenExpression
parenthesizedTokenExpression ::= "(" tokenExpression ")"

構文解析器

TypeDefinition ::= modifiers IDENTIFIER superTypes "{" expression "}"
modifiers ::= ( "$protected" | "$private" )? "$abstract"? | "$parsable" | "$protected-parsable" "$protected"?
superTypes ::= ( "->" TypeName ( "&" TypeName )* )?
AliasDefinition ::= IDENTIFIER "=" expression ";"

expression ::= SelectiveExpression
SelectiveExpression ::= SequentialExpression ( "|" SequentialExpression )*
SequentialExpression ::= postfixExpression*
postfixExpression ::= StarExpression | PlusExpression | OptionalExpression1 | RestrictorExpression | prefixExpression
PlusExpression ::= postfixExpression "+"
RestrictorExpression ::= postfixExpression "/" TypeName
StarExpression ::= StarExpressionConcrete EmptyExpression
StarExpressionConcrete ::= postfixExpression "*"
OptionalExpression1 ::= postfixExpression "?" EmptyExpression
EmptyExpression ::= 
prefixExpression ::= LabeledExpression | primaryExpression
LabeledExpression ::= ( IDENTIFIER | "$label" ) ":" prefixExpression
primaryExpression ::= parenthesizedExpression | EmbedExpression | StringExpression | InlineExpression | IdentifierExpression | OptionalExpression2
EmbedExpression ::= "$embed" "(" expression ")"
StringExpression ::= StringLiteral
InlineExpression ::= TypeDefinition
IdentifierExpression ::= SymbolName
OptionalExpression2 ::= "[" expression "]" EmptyExpression
parenthesizedExpression ::= "(" expression ")"