2017-12-09 2 views
-1

이러한 프로그램을 빌드하기 위해 취해야 할 단계는 무엇입니까?영어로 소스 코드를 파싱하는 방법은 무엇입니까?

영어의 인간 언어로 간단한 (제한된) 자바 키워드를 사용하는 프로그램이 필요합니다.

예를 들어

public class HelloWorld { 

public static void main(String[] args) { 
    int x; 
    int y; 
    System.out.println("Hello, World"); 
} 

} 

하려면 변수 x
변수 y를
를 인쇄 단어 "안녕, 세계"
을 닫기 선언하여 HelloWorld 클래스
선언의 주요 방법
선언 선언 중괄호
중괄호를 닫으십시오.

프로그램은 소스 코드를 한 줄씩 읽습니다.

  • 나는 cl-ppcre를 사용했지만, 문제는, 내가 임시로 말을하는 방법을 파악하지 못할 것입니다.

    예컨대

    선언 HelloWord 다음 추가 "클래스"단어.

    하지Declare class HelloWorld하지만, 나, 그것을 대체하기는 어렵습니다 내가 Declare Helloworld class

  • 을 원한다 ");" 인쇄의 끝에서. 다른 단어는 바꿔야하기 때문에.

나는 라인

으로
(with-open-file (input "~/test.java") 
    (loop for line = (read-line input nil) 
     while line do (format t "~a~%" (parse-laporan line)))) 

을 라인을 읽고 그것을

(defun parse-laporan (isi) 
    (cond 
    ((cl-ppcre:scan "int " isi) 
    (cl-ppcre:regex-replace "int" isi "Declare variable")) 
    ((cl-ppcre:scan "System.out.print+" isi) 
    (cl-ppcre:regex-replace "System.out.print+" isi "print word ")) 
    ((cl-ppcre:scan "System.out.println+" isi) 
    (cl-ppcre:regex-replace "System.out.println+" isi "print word ")) 
    ((cl-ppcre:scan "(" isi) 
    (cl-ppcre:regex-replace "()" isi " ")) 
    ((cl-ppcre:scan "public class" isi) 
    (cl-ppcre:regex-replace "public class" isi "Declare Kelas ")))) 

구문 분석을 시도했지만 잘 작동하지 않습니다.

파일의 모든 내용을 읽고 추상 구문 트리를 작성해야합니까? (통역사처럼) 아니면 단어로 바꾸어서 성취 할 수 있습니까?

+0

António Menezes Leitão의 매우 흥미로운 프로젝트 [lintj] (https://github.com/xach/linj)이며 [프레젠테이션 슬라이드] (https://github.com/xach/linj/blob/master/)입니다. doc/java-for-lispers.pdf) – azzamsa

+1

코드에서 수행하는 작업은 '구문 분석'과 아무 관련이 없습니다. 텍스트 패턴을 각 행에 대한 문자열로 대체하는 것뿐입니다. –

+0

네, 그 말이 맞아요. 그래서 나는 나의 repo에 어떤 "해석"이름도주지 않는다. 나는이 아이디어를 중지해야한다. 'awk' 나'RegEx'처럼 단어를 여기저기서 바꿔서 얻을 수 있다고 생각합니다. 그러나 [Basile Starynkevitch] (https://stackoverflow.com/a/47726100/6000005)는 "당신의 문제는 아마도 당신이 상상하는 것보다 어렵습니다"라고 말했습니다. 나는 그것이 옳다고 생각한다. 그래서 나는 PCL과 PAIP를 마친 후에이 아이디어로 돌아올 것이다. – azzamsa

답변

0

파일의 모든 내용을 읽고 추상 구문 트리를 작성해야합니까?

물론 그렇습니다.

그리고 아마도 트리이 아니지만 일부는 DAG 일 것입니다.

따라서 을 소스 코드의 표현 인 개로 유지하고 싶을 수 있습니다. 여러 번 패스를 원할 수 있습니다.

추신.당신의 문제는 당신이 상상하는 것보다 더 힘들 것입니다. 일부 rule-based system 접근 방식을 고려할 것입니다.

관련 문제