Programming - cpueblo.com

Lua 문법 정리


글쓴이 : 유광희 날짜 : 2011-02-22 (화) 16:51 조회 : 32106

1. 예약어들(변수이름으로 사용불가)

and, local, break, nil, do, not, else, or, elseif, repeat, end, return, false, then, for, true, function, until, if, while, in


2. 스타일
- 상수는 대문자와 밑줄만 사용
- 변수는 소문자로 시작
- 전역 변수는 소문자 g로 시작
- 함수는 대문자로 시작
- 주석은 -- 로 시작 해서 그줄의 끝까지
- 묶음 주석은  --[[ ,]]-- 로 묶는다

3. 데이터형
- nil
- boolean
- string
- number (수치는 모두 배정도 부동소수점 값이다, 5.1버전부터 정수형식 추가)
- table

4. 관계 연산자
- == (table == table은 포인터(or 레퍼) 검사하는것과 같다)
- ~=
- <, >
- <=, >=

5. 논리 연산자
- and ( ex> if (a < b) and (b < 20) then ... end )
- or
- not ( ex> print(not (a == b)) )

6. 제어구조
- if ( ex> if 조건 then ... end )
- while 조건 do ... end
- repeat ... until 조건 -> do while 과 같음
- for 조건 do ... end

  for indx = 10, 1, -1 do  -- 1씩 줄어든다.

  for indx = 1, 10 do       -- 1에서 10까지 1씩 증가하면서 실행(증가값 없으면 1씩이다.)
- break

7. 함수
- function 함수이름( 인자 ) ... end
- ... (다중 argument다) arg table로 들어간다. arg.n은 갯수, arg[index]로 접근가능
- return 값 으로 반환 할수 있다. 여러 값을 반환 가능 return 값1, 값2, 값3
  a, b, c = func()   -->  통해서 다중 반환 값을 a, b, c 가 각각 받는다
※ 함수 중간에서 다른 함수를 호출하기 보다는, return 문에서 함수를 호출하면 return 문을 그 함수의 끝으로 보고 그 함수를 스택에서 제거후 즉시 다음 함수로 건너뜀  --> 함수 호출들이 꼬리에 꼬리를 물고 있는 상황이라도 스택이 넘치는 일을 방지 가능

8. 표준 라이브러리
- www.lua.org/manual/5.0/ 에서 열람 가능

- http://www.codenix.com/~tolua/ tolua 자료

- http://www.tecgraf.puc-rio.br/~celes/tolua/
- assert (청크)()  -- 컴파일된 루아 스크립트 청크를 하나의 처리 함수처럼 실행 하도록 한다.
- loadstring("루아스크립트 string")  -- 루아 스크립트 string으로 부터 청크를 적재, 컴파일
- loadfile("루아스크립트 파일") -- 루아 스크립트 file로 부터 청크를 적재, 컴파일(dofile()을 대신 주로 사용)
- loadstring() 으로만 청크를 실행 가능하다. assert는 에러 발생시 직접 언급하는 오류 메시지 보여줌, loadstring 경우 도움이 되지 않는 오류 메세지 출력
  ex) assert(loadstring("print(\"hello\")"))()
  ex) loadstring("print(\"hello\")")()

- 수학 함수들
  -- math.floor() -- 주어진 수의 소수부를 버리고 정수로 변환
  -- math.random() -- 난수 발생 (a, b) 경우 a, b 포함해서 그사이 발생
  -- math.randomseed( seed값 ) -- seed 값은 보통 os.date("%d%H%M%S") 사용
  -- math.min(), math.max()

- 문자열
  -- tonumber(변수) -- 문자열을 수치로 변환, 반대 -- tostring()
  -- string.char(n1, n2, ...) -- 주어진 수치 인수들을 ASCII값들로 해석하고 해당하는 문자들로 하나의 문자열을 만들어 돌려줌
  -- string.len(myString) -- 문자열 길이를 돌려줌
  -- string.sub(myString, start, end) -- 문자열의 한부분을 돌려줌
  -- string.format() -- 문자열을 포매팅 하여 만든 문자열을 돌려줌
  -- string.find(sourceString, findString) -- sourceString에서 findString 이 처음 나타난 부분의 시작과 끝 위치를 돌려줌, a, b = string.find(sourceString, findString)
 
- 문자열과 패턴
  : filter = "$%d" -- 이것은 $로 시작하고 정수가 붙는 값만 통과 시키는 일종의 틀이다. string.find(string, filter) 이런식으로 사용가능하다
  -- string.gsub(sourceString, pattern, replacementString) -- sourceString으로 주어진 문자열에서 pattern으로 지정된 패턴에 부합하는 부분을 replacementString으로 주어진 문자열로 치환한다.
  -- string.gfind(srcString, pattern) -- 첫번째 인수로 주어진 문자열에서 두번째 인수로 주어진 패턴을 한번에 하나씩 차례로 찾아나간다.

- 테이블
  -- table.getn(myTable) -- 테이블의 요소 갯수를 돌려줌
  -- table.sort(myTable) -- 테이블의 요소들을 크기 비교를 통해서 오름차순으로 정렬
  : 두번재 인자를 지정해서 크기비교 방식을 바꿀수 있다.
    (ex) function Reverse(a, b) ... end  -- Reverse 함수는 a, b 두개를 비교 연산 하여 true, false를 리턴하는 함수다.
          table.sort(myTable, Reverse)

  -- table.insert(myTable, position, value) -- 테이블에 새 요소를 추가
  -- table.remove(myTable, position) -- 테이블에서 특정 요소를 제거하고 그 요소를 돌려줌
 
- 테이블 요소의 참조 표기 가능
  ex) myData = {}
      myData.name = "kino"
      myData.age = 26

      myData[1] = 3
      myData[2] = 4
     -- myData[index] 와  myData.키 를 같이 가질수 있다.
  -- 다차원 배열
  :  myData.name[1] = "a"
     myData.name[2] = "b"
  -- pairs() -- 테이블의 요소를 한번에 하나씩 접근 할 때 사용(정수 색인 요소들에만 접근 하고 싶을 경우 ipairs())
  ex) for index, value in pairs(myTable) do ... end

- 기본적인 입출력
  -- myFile = io.open("파일이름", "w") -- "w" 옵은 c와 다른것은 존재 파일 열때 지우고 새로 만드는것이 아니라 열고 쓰기 위치를 파일의 시작으로 설정
  -- if myFile ~= nil -- 로 검사후 파일 열거나 오류(nil 리턴) 를 체크하고 파일에 쓰거나 읽는다.
  -- myFile:write(string) -- 연 파일에 쓰기
  -- io.close(myFile) -- 파일 닫기



9. 루아를 c/c++ 프로그램에 통합
- Lua environment : 루아의 실행에 필요한 모든 자료(컴파일된 함수, 변수, 기타 작업용 메모리) 로 구성
  -- 자료는 lua_State 구조체에 저장 (1나에서 여러개 여는것 가능)
  -- 루아에게 자료를 보내거나 루아로부터 자료를 받는 수단으로 사용
 
- Lua Glue
  -- C++로 작성된 함수를 루아 스크립트 안에서 호출 가능

- 기본적인 구현

//C로 작성된 루아헤더들을 C++이름 섞기 적용 말라는 표시를 해줘서 인클루드 한다
extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}

//루아 글루 함수 들을 정의 - 마찬가지로 C++ 이름 섞기방지
extern "C" {
int _Test(lua_State * L) {
}
int _Test2(lua_state * L) {
}
...
}

int main() {
  //루아 환경 생성
  lua_State * L = luaL_newstate();    //lauxlib.h 필요 - 자동을 alloc 해주는 함수, 직접 함수 정의 가능
  luaopen_base(L);    //루아 표준 라이브러리를 초기화
 
  //루아글루 등록
  lua_register(L, "Test", _Test);
  lua_register(L, "Test2", _Test2);

  //기타 함수
  luaL_loadbuffer(L, const char * buff, int strlen, int);
  luaL_loadfile(L, "루아파일이름");    //파일 열기
  lual_resume(L, int);    //엔진내로 읽어들임
  lua_pcall(L, int, int, int);
  luaL_checkstring(L, int);

  //루아 해제 함수
  lua_close(L);
}