어떻게 파싱하니
if (a > b && foo(param)) {
doSomething();
} else {
doSomethingElse();
}
구문 분석 트리는 아마도
if:
condition:
and:
lt:
left: a
right: b
function:
name: foo
param: param
true-block:
function:
name: doSomething
false-block:
function:
name: doSomethingElse
흠 ...이 트리를 접두사 표기법으로 목록으로 직렬화합시다.
if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))
이 구문 분석 트리 형식은 조작하기가 쉽지만 한 가지 문제가 있습니다. 나는 구분 기호가 싫어. 나는 터미네이터를 좋아한다. 동시에, 나는 공백에 뿌리는 것을 좋아합니다.
if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))
흠 ... 추가 공백은 특정 것들을 구문 분석하기 어렵게 만듭니다 ... 어쩌면 나무가 (뿌리 잎 잎)으로 표시되는 규칙을 만들 수 있습니다.
(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)
이제 구문 분석 트리의 직렬화 는 lisp입니다 (적용 할 함수 이름 바꾸기, 아마도 실행됩니다). 프로그램을 작성하는 프로그램을 원한다면 구문 분석 트리를 조작하는 것이 좋습니다.
이것이 전적으로 s-expression의 방식은 아니지만 초기에 확인되었으며 lisp 프로그래머가 사용하는 기능 중 하나입니다. 우리의 프로그램은 어떤 의미에서 미리 파싱되어 있으며, 형식 때문에 프로그램을 조작하기위한 프로그램을 작성하는 것은 매우 쉽습니다. 이것이 구문 부족이 때로는 강점으로 여겨지는 이유입니다.
그러나 David가 말했듯이 s- 표현식 인식 편집기를 사용하십시오. xml의 닫는 중괄호보다 s- 표현의 닫는 중괄호를 잃어 버릴 가능성이 높습니다 ( </foo>
닫히지 <foo>
만 오른쪽 paren은 모든 s- 표현을 닫습니다). 라켓에서는 일부 들여 쓰기 스타일과 함께 대괄호를 사용하여 대부분의 문제를 해결합니다.
lisp 버전 :
(if (and (< a b) (foo param))
(doSomething)
(doSomethingElse))
나쁘지 않아.