2016-07-21 11 views
-3

나는 현재 Common LISP를 배우고 있으며 막대한로드 블록을 만났다. 커먼 LISP에서 파서를 만드는 법을 배웠다는 과제를 받았습니다. 필자는 문법 규칙에서부터 렉서 (lexer)에 이르기까지 다양한 소스를 통해 온라인으로 도움을주는 모든 것을 구현했습니다. 나는 다른 한편으로는 심볼 테이블을 구현하는 방법을 알아낼 수 없다.Common Lisp에서 심볼 테이블을 시뮬레이트하는 방법

이것은 내가 지금까지 심볼 테이블에 관해 가지고있는 것입니다.

(defun symtab-add (state id) 
;; *** add symbols to symbol table *** 
) 

(defun symtab-member (state id) 
;; *** look up symbols in symbol table *** 
) 

(defun symtab-display (state) 
    (format t "------------------------------------------------------~%") 
    (format t "Symbol Table is: ~S ~%" (pstate-symtab state)) 
    (format t "------------------------------------------------------~%") 
) 

누군가가 나에게 튜토리얼을 연결하거나 나에게 코드 예제를 제공하거나 내가 슈퍼 감사 할 것이 나를 도울 수있는 경우에만 표시 부분 관리 필자 볼 수 있듯이.

내 할당을위한 모든 소스 코드 : http://www.cs.kau.se/cs/education/courses/dvgc01/LISP/newstart.lsp

+1

코드는 여기에서 있습니다 : http://www.cs.kau.se/cs/education/courses/dvgc01/LISP/newstart.lsp –

+0

"Common LISP에서 기호 표를 시뮬레이트하는 방법"1) Common Lisp "이 아니라 일반적인 LISP (소리내어 말할 필요 없음). 2) Rainer가 지적했듯이, 그 코드는 다른 곳에서 가져온 것입니다.게시하는 코드의 저작자 표시를 제공해야하며 * 자신이 자신의 것으로 주장해서는 안됩니다. 3) 왜 심볼 테이블을 "시뮬레이트"합니까? 하나만 구현하고 싶지 않니? 이 표현은 Common Lisp에서 기호 테이블을 구현할 수 없다는 것을 의미합니다. –

+0

네, 그게 실제로 제 임무입니다. 그것이 불분명하면 미안합니다. 좋아, 그래서 심볼 테이블을 구현하고 싶다. (할당은 간단한 파스칼 프로그램을 파싱하는 것이다.) 당신은 나에게 포인터를 주거나 올바른 방향으로 나를 가리킬 수 있습니까? 링크에서 볼 수 있듯이 미완성 된 코드를 보냈습니다. 끝내기위한 나의 임무입니다. 기호 표를 제외한 모든 작업이 완료됩니다. – Joo223

답변

-3

먼저 당신이 심볼 테이블을 만들어야합니다는 말 :

(setq my-symbol-table nil) 

, 우리는 패키지를 무시 간단하게하기 위해; 나중에 그것에 대해 배울 수 있습니다.

다음으로 기호를 테이블에 저장하는 방법을 결정해야합니다. 다시 간단히 말하면 기호 이름과 기호 값의 쌍으로 연관 목록으로 저장할 수 있습니다. 당신은 값 3, 5로 기호 A와 B를 저장하는 경우 예를 들어, 다음과 같은 심볼 테이블 것이다 :

> my-symbol-table 

> ((a . 3) (b . 5)) 

이 연관리스트를 사용하려면를, 당신은 기능 ASSOC, 푸시, rplacd를 사용할 수 있습니다.

예 :

  • 은 새 심볼을 추가

    (푸시 '(C 0) 내 심볼 테이블.)

  • 상징 찾기 : (

    을 assoc 'c my-symbol-table)

  • 기존 sy 값을 변경하십시오. mbol :

    (rplacd 내 심볼 테이블 C (ASSOC ') 18)

나는 이것이 당신이 가야하기에 충분 바랍니다.

+2

'setq'는 기존 바인딩을 변경하기위한 것입니다. 'my-symbol-table'과'* earmuffs * '는 어디에 정의합니까? – Sylwester

+0

OP의 질문에서 특정 값과 관련된 심볼이 필요한 것처럼 보이지 않습니다. "범위 이름"목록을 필요로하는 것처럼 보였습니다 (lexer/parser에 대해 좀 더 이해가됩니다. 그러나 순수한 lexing 및 구문 분석보다 조금 더 많은 것이지만 의미 론적 분석은 검사를 담당해야합니다 변수 범위 등). –

1

정확한 요구에 따라 "목적에 맞는"다양한 수준의 기호 표를 구현하는 여러 가지 방법이 있습니다. 하루가 끝나면 심볼 테이블은 실제로 "심볼 이름"에서 무언가로 매핑됩니다.

그래서 당신이 일을 추가 할뿐만 아니라 물건을 추가 할 수있게하는 모든 데이터 구조가 작동해야합니다. 상당히 일반적인 구현은 "해쉬 테이블 사용"또는 "알리 스트 사용"입니다 (후자는 기본적으로 양식 (<symbol> . <data>)의 쌍 목록입니다).

+0

그래, 해시 테이블은 갈 길이야? Thats 음식 원인 ive 해시 테이블 및 clisp에 많이 알 수 있습니다. 답변 해주셔서 감사합니다! – Joo223