2017-03-15 2 views
0

로그를 파싱하는 작은 hylang 프로그램을 작성했습니다. 다음구문 분석시 왜 내 프로그램이 실패합니까?

File "", line 8, column 38

 (setv rule (.next irule))))))) 
           ^LexException: Ran into a RPAREN where it wasn't expected. 

질문 (별도로 평가 오류를 준다)로 기능한다 :

(defmain [&rest args] 
    (setv inname (get args 1)) 
    (setv outname (get args 2)) 
    (with [ifile (open inname 'r')] 
    (with [ofile (open outname 'w')] 
     (setv tl (Tableline)) 
     (setv irule (iter (.get-rule tl))) 
     (setv rule (.next irule)) 
     (for [line ifile] 
     (setv match (re.match (get rule 0) line)) 
     (when match 
      (for [(, group-num attr-data) (enumerate (get rule 1))] 
      (setattr tl (get attr-data 1) (apply (get attr-data 0) 
               [(.group match (inc group-num))]))) 
      (if (. tl ready) (write ofile (str tl))) 
      (setv rule (.next irule))))))) 

을 최대한 멀리로 내가 그것을 평가하려고 할 때, 나는 다음과 같은 오류가 발생합니다 그 자리에있는 모든 괄호로 균형 잡힌 표현이라고 말할 수 있습니다. 왜 렉서가 실패합니까?

내 프로그램의 전체 텍스트는 여기에 있습니다 : pastebin

답변

0

.

lisps에서 작은 따옴표는 문자열 작성과 완전히 다른 것으로 사용됩니다. 다음 양식을 "인용"합니다. lisp 코드가 구문 분석되면 'a과 같은 표현식이 (quote a)으로 변환됩니다. 유사하게, '(hello)(quote (hello))이됩니다. 항상 다음 표현식을 감싸기 때문에 하나의 '표시 만 있습니다. 견적 양식을 사용하면 단일 표현식에 대한 평가를 "해제"할 수 있습니다. lisp 인용문을 찾으십시오. 이것은 매우 유용하며 언어의 더 강력한 기능 중 일부에 중요합니다.

0

는 대신 "w"와 "R"을 사용했다 whould 'w'와 'R'당신은 문자열을 만들기 위해 따옴표를 사용할 필요가