루아 레퍼런스 매뉴얼 — 완전한 문법

루아 레퍼런스 매뉴얼 — 완전한 문법 (The Complete Syntax of Lua)

여기저기 규칙이 쪼개져 있던 문법을 한자리에 모아 볼 때가 왔어요. 이번 장은 루아의 전체 문법을 확장 BNF(extended BNF) 표기로 정리해 둔 구간이에요. 문법 규칙을 처음부터 끝까지 훑다 보면, 앞서 배운 문장(statement)과 수식(expression)이 어떻게 서로 연결되어 있는지 한눈에 보이게 되죠.

출처: Lua 5.4 Reference Manual, §9 "The Complete Syntax of Lua" — https://www.lua.org/manual/5.4/manual.html

본문

전체 문법이 확장 BNF로 정리되어 있어요. 확장 BNF에서 쓰는 표기법만 짚고 넘어갈게요. {A}는 A가 0개 이상 온다는 뜻이고, **[A]는 A가 있어도 되고 없어도 된다(optional)**는 뜻이에요. 연산자의 우선순위가 궁금하면 §3.4.8을, Name·Numeral·LiteralString 같은 터미널(끝말)에 대한 자세한 설명은 §3.1을 참고하시면 돼요.

아래 문법 규칙은 원문을 그대로 옮겨 놓은 거라서, 각 규칙의 줄바꿈과 들여쓰기가 훼손되지 않았어요. 큰따옴표로 묶인 기호는 말 그대로 그 기호 하나를 뜻하고, 굵은 글씨는 예약어(keyword)예요.

	chunk ::= block

	block ::= {stat} [retstat]

	stat ::=  ‘;’ | 
		 varlist ‘=’ explist | 
		 functioncall | 
		 label | 
		 break | 
		 goto Name | 
		 do block end | 
		 while exp do block end | 
		 repeat block until exp | 
		 if exp then block {elseif exp then block} [else block] end | 
		 for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end | 
		 for namelist in explist do block end | 
		 function funcname funcbody | 
		 local function Name funcbody | 
		 local attnamelist [‘=’ explist] 

	attnamelist ::=  Name attrib {‘,’ Name attrib}

	attrib ::= [‘<’ Name ‘>’]

	retstat ::= return [explist] [‘;’]

	label ::= ‘::’ Name ‘::’

	funcname ::= Name {‘.’ Name} [‘:’ Name]

	varlist ::= var {‘,’ var}

	var ::=  Name | prefixexp ‘[’ exp ‘]’ | prefixexp ‘.’ Name 

	namelist ::= Name {‘,’ Name}

	explist ::= exp {‘,’ exp}

	exp ::=  nil | false | true | Numeral | LiteralString | ‘...’ | functiondef | 
		 prefixexp | tableconstructor | exp binop exp | unop exp 

	prefixexp ::= var | functioncall | ‘(’ exp ‘)’

	functioncall ::=  prefixexp args | prefixexp ‘:’ Name args 

	args ::=  ‘(’ [explist] ‘)’ | tableconstructor | LiteralString 

	functiondef ::= function funcbody

	funcbody ::= ‘(’ [parlist] ‘)’ block end

	parlist ::= namelist [‘,’ ‘...’] | ‘...’

	tableconstructor ::= ‘{’ [fieldlist] ‘}’

	fieldlist ::= field {fieldsep field} [fieldsep]

	field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp

	fieldsep ::= ‘,’ | ‘;’

	binop ::=  ‘+’ | ‘-’ | ‘*’ | ‘/’ | ‘//’ | ‘^’ | ‘%’ | 
		 ‘&’ | ‘~’ | ‘|’ | ‘>>’ | ‘<<’ | ‘..’ | 
		 ‘<’ | ‘<=’ | ‘>’ | ‘>=’ | ‘==’ | ‘~=’ | 
		 and | or

	unop ::= ‘-’ | not | ‘#’ | ‘~’

더 알아보기

  • 루아 레퍼런스 매뉴얼 (5.4) 전체 — 문법을 구성하는 각 요소(어휘, 수식, 문장)의 상세 설명이 필요하면 이 문서를 참고하세요.
  • §3.1 — Name, Numeral, LiteralString 같은 터미널의 정의.
  • §3.4.8 — 연산자 우선순위와 결합 방향.
  • 루아 5.4 소스 저장소 — 위 문법을 실제 파서(lparser.c) 구현과 대조해 보고 싶을 때 유용해요.