2014-04-05 3 views
0

그래서 저는 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))) 

답변

0

이 질문은 Ignore whitespace with PEG.js

공백과 줄 바꿈을 모두 무시하는 것입니다.

(f x 

    (g  y (

     h z t))) 
: 다음과 같은 문자열을 줄 때 구문 분석을 위의 코드가 실패하는 이유는 실제로 모르겠지만, 주위를 연주 후, 나는 내가 그래서

Start 
    = List 

Character 
    = [^ \t\r\n"("")"] 

LeftParenthesis 
    = "(" 

RightParenthesis 
    = ")" 

Separator 
    = [ \t\r\n] 

Token 
    = List 
/token:Character+{return token.join("");} 

Tuple 
    = first:Token second:Separator+ rest:Tuple*{ 
     return rest.length > 0 ? first.concat([" "]).concat(rest) : first; 
    } 
/Token 

List 
    = left:LeftParenthesis Separator* token:Tuple Separator* right:RightParenthesis{ 
     return [left].concat(token).concat([right]).join(""); 
    } 

원하는 일을 할 수 pegjs을 얻을 수 있었다 내가 원하는 정확히 무엇

파서 출력

"(f x (g y (h z t)))"