부속서 A 문법 전체 (규범)
(1) 이 부속서는 본문의 구문 규칙을 한 자리에 모은다. 표기는 ISO/IEC 14977 의 모양이다: a b 는 차례, a | b 는 고르기, [ a ] 는 있거나 없음, { a } 는 0 번 이상, (* … *) 는 설명, ? … ? 는 말로 적은 규칙이다. 대문자 이름은 6절이 정하는 토큰이다. 토큰 사이에는 공백과 주석이 몇 개든 올 수 있다. 새 이름 바로 앞은 예외다(6.3 (4)).
(2) 문법은 토큰 하나를 미리 보고 읽힌다. 예외는 서명의 매개변수로, 이름인지 타입인지 가르려고 다음 토큰까지 본다. 이름이 무엇을 가리키는지(지역 변수, 전역, 낱말)와 스택의 타입은 문법이 아니라 선언과 검사가 정한다.
(* 6: tokens *)
NAME = letter { letter | digit } ; (* not a reserved word *)
PATH = NAME "." member { "." member } ; (* member: a run of letters and digits *)
INT = [ "+" | "-" ] ( digits | "0x" hex-digits | "0b" bit-digits ) ;
DEC = [ "+" | "-" ] digits "." digits ; (* 7.5 *)
CHAR = [ "U" ] "'" ( char-byte | escape ) "'" ;
STRING = '"' { string-byte | escape } '"' ;
RAWSTRING = "r" '"' { raw-byte } '"' ;
TEXT = "text" TAG newline { text-line newline } TAG ;
BOOL = "true" | "false" ;
literal = INT | DEC | CHAR | STRING | RAWSTRING | TEXT | BOOL ;
(* 6.7, 13: a source *)
source = [ "pinax" INT ] { item } ;
item = import | search | forward | declaration | definition | row-item | assign-item | body ;
import = "use" NAME [ "as" NAME ] ;
search = "search" ( "(" [ NAME { "," NAME } ] ")" | "none" ) ; (* 13.5 *)
forward = "forward" ( "array" | "list" | "pool" ) NAME
| "forward" "word" NAME "(" effect ")" ;
(* 8: declarations *)
declaration = [ "export" ] ( [ "bound" ] bindable | "shared" shareable | decl ) ;
bindable = "global" NAME type | "array" NAME type capacity | "buffer" NAME capacity ;
shareable = bindable | "list" NAME type capacity | "index" NAME NAME PATH ;
decl = "const" NAME literal
| "err" NAME
| "list" NAME type capacity | "queue" NAME type capacity | "pool" NAME NAME capacity
| "record" NAME { field | "big_endian" } "end"
| "type" NAME ( "int" | "bool" | "str" | "dec" "(" INT ")" )
| "index" NAME NAME PATH
| "tasks" NAME capacity [ size [ size [ size ] ] ] [ "apart" ]
| "extern" c-name "(" effect ")" "from" STRING [ "as" NAME ]
| "test" NAME { body } "end" ;
capacity = size | "host" ;
size = INT | NAME ;
field = NAME NAME [ "(" size ")" ] ;
c-name = NAME | reserved-word | STRING ;
row-item = [ "export" ] "row" NAME [ NAME ] "(" value { "," value } ")" ;
assign-item = "assign" NAME "(" value { "," value } ")" ;
value = literal | NAME ;
(* 9: words *)
definition = [ "export" ] "word" NAME "(" effect ")" { body } "end" ;
effect = [ params ] [ "gives" params ] [ "or" "fail" ] ;
params = param { "," param } ;
param = [ NAME ] ( type | coll-type ) ;
type = [ "owned" ] ( NAME [ "(" size ")" ] | "word" "(" effect ")" ) ;
coll-type = ( "array" | "list" | "queue" ) NAME [ "(" size ")" ] | "buffer" ; (* an input, 9.9 *)
(* 9 to 11: the body *)
body = literal | NAME | PATH | store | set | fits | block | cat | guard | control | defer
| "," | "." (* the end of a statement, 10.8 *)
| "return" | "fail" | ( "while" | "until" | "break" ) [ "(" NAME ")" ] ;
store = "to" ( NAME | PATH | "(" NAME { "," NAME } ")" ) ; (* a local, or a field *)
set = "set" ( NAME | PATH ) ; (* a global, 9.4 *)
fits = "fits" ( NAME | PATH ) ; (* a str(N) place, 7.3 *)
block = "do" [ "(" effect ")" ] { body } "end" ;
cat = "cat" "(" phrase { "," phrase } ")" ;
phrase = body { body } ;
guard = "or_fail" | "or_return" | "or_else" [ "(" NAME ")" ] { body } "end" ;
control = "if" { body } [ "else" { body } ] "end"
| "loop" [ "(" NAME ")" ] { body } "end"
| "case" { branch } [ "otherwise" { body } "end" ] "end" ;
defer = "defer" { body } "end" ; (* 10.7 *)
branch = ( case-value | "(" case-value { "," case-value } ")" ) "of" { body } "end" ;
case-value = literal | NAME | PATH ;(3) 자료 적재(13.4)의 소스는 13.4 의 data-source 를 따른다.