Yash マニュアル: 構文の形式的定義
Author: magicant
Description: 解析表現文法による yash の構文の形式的定義

# 構文の形式的定義

ここに yash の文法の形式的定義を示します。Yash の文法は解析表現文法で定義されます。

Yash の文法における終端記号の集合は、yash を実行する環境が扱える任意の文字の集合 (実行文字集合) です (ただしナル文字 '\0' を除く)。

以下は、yash の文法を構成する非終端記号とそれに対応する終端記号の一覧です。ただしここに挙げる文法の定義にはヒアドキュメントの内容とその終わりを表す行の解析のための規則は含まれていません。また POSIX 準拠モードでは構文が若干変わりますが、ここには示しません。

CompleteCommand
  Sequence EOF
Sequence
  N* List*
List
  Pipeline ((`&&` / `||`) N* Pipeline)* ListSeparator
Pipeline
  Bang? Command (`|` N* Command)*
Command
  CompoundCommand Redirection*
  !R FunctionDefinition
  !R SimpleCommand
CompoundCommand
  Subshell
  Grouping
  IfCommand
  ForCommand
  WhileCommand
  CaseCommand
  FunctionCommand
Subshell
  `(` Sequence `)` S*
Grouping
  LeftBrace Sequence RightBrace
IfCommand
  If Sequence Then Sequence (Elif Sequence Then Sequence)* (Else Sequence)? Fi
ForCommand
  For Name S* Separator? (In Word* Separator)? Do Sequence Done
WhileCommand
  (While / Until) Sequence Do Sequence Done
CaseCommand
  Case Word N* In N* CaseItem* Esac
CaseItem
  !Esac (`(` S*)? Word (`|` S* Word)* `)` Sequence (`;;` / &Esac)
FunctionCommand
  Function Word (`(` S* `)`)? N* CompoundCommand Redirection*
FunctionDefinition
  Name S* `(` S* `)` N* CompoundCommand Redirection*
SimpleCommand
  &(Word / Redirection) (Assignment / Redirection)* (Word / Redirection)*
Assignment
  Name `=` Word
  Name `=(` N* (Word N*)* `)`
Name
  ![[:digit:]] [[:alnum:]`_`]+
PortableName
  ![`0`-`9`] [`0`-`9` `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_`]+
Word
  (WordElement / !SpecialChar .)+ S*
WordElement
  `\` .
  `'` (!`'` .)* `'`
  `"` QuoteElement* `"`
  Parameter
  Arithmetic
  CommandSubstitution
QuoteElement
  `\` ([`$`"\`] / NL)
  Parameter
  Arithmetic
  CommandSubstitution
  ![``"\`] .
Parameter
  `$` [`@*#?-$!`[:digit:]]
  `$` PortableName
  `$` ParameterBody
ParameterBody
  `{` ParameterNumber? (ParameterName / ParameterBody / Parameter) ParameterIndex? ParameterMatch? `}`
ParameterNumber
  `#` ![`+=:/%`] !([`-?#`] `}`)
ParameterName
  [`@*#?-$!`]
  [[:alnum:]`_`]+
ParameterIndex
  `[` ParameterIndexWord (`,` ParameterIndexWord)? `]`
ParameterIndexWord
  (WordElement / ![`],`] .)+
ParameterMatch
  `:`? [`-+=?`] ParameterMatchWord
  (`#` / `##` / `%` / `%%`) ParameterMatchWord
  (`:/` / `/` [`#%/`]?) ParameterMatchWordNoSlash (`/` ParameterMatchWord)?
ParameterMatchWord
  (WordElement / !`}` .)*
ParameterMatchWordNoSlash
  (WordElement / ![`/}`] .)*
Arithmetic
  `$((` ArithmeticBody* `))`
ArithmeticBody
  `\` .
  Parameter
  Arithmetic
  CommandSubstitution
  `(` ArithmeticBody `)`
  ![``()`] .
CommandSubstitution
  `$(` Sequence `)`
  ``` CommandSubstitutionBody* ```
CommandSubstitutionBody
  `\` [`$`\`]
  !``` .
Redirection
  RedirectionFD RedirectionOperator S* Word
  RedirectionFD `<(` Sequence `)`
  RedirectionFD `>(` Sequence `)`
RedirectionFD
  [[:digit:]]*
RedirectionOperator
  `<` / `<>` / `>` / `>|` / `>>` / `>>|` / `<&` / `>&` / `<<` / `<<-` / `<<<`
ListSeparator
  Separator
  `&` N*
  &`)`
  &`;;`
Separator
  `;` N*
  N+
  EOF
N
  S* NL
S
  [[:blank:]]
  Comment
Comment
  `#` (!NL .)*
R
  Bang / LeftBrace / RightBrace / Case / Do / Done / Elif / Else / Esac / Fi / For / If / In / Then / Until / While
Bang
  `!` D
LeftBrace
  `{` D
RightBrace
  `}` D
Case
  `case` D
Do
  `do` D
Done
  `done` D
Elif
  `elif` D
Else
  `else` D
Esac
  `esac` D
Fi
  `fi` D
For
  `for` D
Function
  `function` D
If
  `if` D
In
  `in` D
Then
  `then` D
Until
  `until` D
While
  `while` D
D
  !Word S*
SpecialChar
  [`|&;<>()`\"'`[:blank:]] / NL
NL
  '\n'
EOF
  !.