루아 레퍼런스 매뉴얼 — 완전한 문법
루아 레퍼런스 매뉴얼 — 완전한 문법 (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) 구현과 대조해 보고 싶을 때 유용해요.