그래서 저는 pegjs에 아주 기본적인 Lisp 파서를 쓰려고 노력하고 있습니다. Lisp 코드가 구문 상 유효하고 적합하다면 같은 코드를 내뱉습니다. 한 줄.파서는 임의의 개행과 공백을 파싱하지 않습니다.
어디에도 삽입 된 개행 문자를 허용 할 수 있도록 파서를 확장하여 코드의 공백을 추가하고 싶습니다. I가 "튜플"에 대한 규칙을 변경 시도, 줄 바꿈과 공백 수 있도록 내 시도,
Start
= List
Character
= [^\n" ""("")"]
LeftParenthesis
= "("
RightParenthesis
= ")"
WhiteSpace
= " "
NewLine
= "\n"
Token
= token:Character+{return token.join("");}
Tuple
= left:Token WhiteSpace+ right:List?{
return left.concat([" "]).concat(right);
}
/Token
List
= left:LeftParenthesis tuple:Tuple right:RightParenthesis{
return left.concat(tuple).concat(right);
}
/Tuple
다음 :
그래서 여기 만큼 모든 것을 한 줄에 같이 작동 코드의 규칙에 추가 겉으로는 비 재귀하지만
Tuple
= left:Token WhiteSpace+ (NewLine* WhiteSpace*)* right:List?{
return left.concat([" "]).concat(right);
}
/Token
는하지만이 변화는 pegjs 무한 루프로 이동됩니다.
참고 :이 경우 내가 할 노력하고있어 불분명, 나는 pegjs이
(f x
(g y
(h z t)))
을 구문 분석하고 같이 하나 같은 코드를 뱉어 파서을 뱉어되도록 문법을 쓰고 있어요 문자열 또는 단지
"(f x (g y (h z t)))"
어느 것이 든 나를 위해 일한다. 나의 현재 작업 문법이 무엇
나는,
"(f x (g y (h z t)))"
단지 하나 개의 개행 문자 이후의 모든 "토큰"또는 "튜플"를 허용하는 사소한 동안
(f x (g y (h z t)))
과 출력을 가지고있다 다음을 법적 코드로 허용하고 싶습니다.
(f x
(g y (
h z t)))