2014-03-19 6 views
1

OCaml에 통역사를 쓰려고하는데 여기에 문제가 있습니다. 내 프로그램에서OCaml interpreter : 함수 내의 함수를 평가하십시오.

, 나는 예를 들어, 다음과 같이 함수를 호출 할 :

print (get_line 4) // print: print to stdout, get_line: get a specific line in a file 

내가 어떻게 할 수 있습니까? 문제는 파서 (parser)에 있습니다. 프로그램이 어떻게 실행되는지, 함수가 정의되는 방법 및 프로그램의 흐름을 정의하는 것처럼 생각합니다. 이것은 파서에서 렉서 (아래 코드)가 지금까지 가지고있는 것이지만 작동하지 않는 것 같습니다. 나는 내 코드와 계산기 사이에 어떤 차이가 있는지 보지 않고, 괄호 안의 문장을 먼저 평가 한 다음 그 값을 부모 연산으로 반환하여 다음 평가를 수행한다.

내 해석기에서 괄호 안에 함수 get_line이 먼저 평가되지만 print 함수에 값을 반환하지 않거나 잘못 입력 한 것으로 생각됩니다 (확인했지만이 오류라고 생각하지 않습니다) .

계산기와 인터프리터의 차이점 중 하나는 계산기가 기본 유형으로 작업한다는 것입니다. 그러나 그들은 비슷해야합니다.

parser.mly :

%token ODD 
%token CUT 
%start main 
%type <Path.term list> main 
%% 

main: 
    | expr EOL main {$1 :: $3} 
    | expr EOF { [$1] } 
    | EOL main { $2 } 
; 
expr: 
     | ODD INT { Odd $2} 
    | ODD LPAREN INT RPAREN expr { Odd $3 } 
     | CUT INT INT { Cut ($2, $3)} 
    | CUT INT INT expr { Cut ($2, $3) } 

lexer.mll가 :

{ 
    open Parser 
} 
(* define all keyword used in the program *) 
rule main = 
    parse 
     | ['\n'] { EOL } 
     | ['\r']['\n'] { EOL } 
     | [' ''\t''\n']  { main lexbuf }  
     | '('  { LPAREN } 
     | ')'  { RPAREN } 
     | "cut" { CUT }  
     | "trunclength" { TRUNCLENGTH } 
     | "firstArithmetic" { FIRSTARITH } 
     | "f_ArithmeticLength" { F_ARITHLENGTH } 
     | "secondArithmetic" { SECARITH } 
     | "s_ArithmeticLength" { S_ARITHLENGTH } 
     | "odd" { ODD } 
     | "oddLength" { ODDLENGTH } 
     | "zip" { ZIP } 
     | "zipLength" { ZIPLENGTH } 
     | "newline" { NEWLINE } 
     | eof { EOF }    
     | ['0' - '9']+ as lxm { INT(int_of_string lxm) } 
     | ['a'-'z''A'-'Z'] ['a'-'z''A'-'Z''0'-'9']* as lxm { STRING lxm } 

답변

0
| ODD LPAREN INT RPAREN expr { Odd $3 } 

귀하의 문법 규칙이 INT을 필요로

이 내 코드, 그것의 단지 부분이다 괄호 사이에. 이를 expr으로 변경해야합니다. 이 문제는 여러 가지가 있지만 그 부분을 남겨 두겠습니다.

0

먼저 파서는 Path.term의 목록을 만들려고 시도하지만 그걸로 무엇을하고 싶습니까?

그렇다면 파서에는 많은 문제가 있으므로 어디서부터 시작해야할지 모릅니다. 예를 들어, expr 규칙의 두 번째 및 네 번째 경우는 마지막으로 expr을 무시합니다. 또한, 파서는 포함 된 표현을 인식 "이상한 <INT>"(또는 "홀수 (<INT>)") 및 "<INT> <INT>를 잘라"그래서 어떻게 printget_line을 평가하도록되어? 질문을 수정하고 명확하게 작성해야합니다. 식을 평가하기 위해

, 당신은

  • 이 (계산기의 예에서와 같이) 직접적으로 의미 - 행동의 내부에 그것을 할 수 있습니다,
  • 또는 (더 나은) (추상 구문 트리의 경우) AST를 구축하여 파서를 읽고 해석하십시오. 당신이 print (get_line 4)를 해석하려면

, 당신의 파서는 printget_line이 무엇을 의미하는지 알 필요가있다. 코드에서 파서는 print 또는 get_lineSTRING 토큰 (문자열 값 포함)으로 표시합니다.언어로 된 키워드 인 것처럼 보이기 때문에 렉서는이를 인식하고 특정 토큰을 반환해야합니다.

+0

Path.term이 우리의 인터프리터에 정의되어 있으므로 나는 괜찮을 것이라고 생각합니다. –

+0

괜찮 았지만 무엇에 사용됩니까? 그리고 당신이하고 싶은 일과 관련이 있습니다 : "프로그램을 intrepret"? –

+0

이 파일에는 lexer에 정의 된 키워드가 사용하는 모든 기능이 포함되어 있습니다. 그래서 내 프로그램에서 렉서 (lexer)에 정의 된 키워드를 호출하면, 파서에 의해 구문 분석되고, 구문 분석 된 키워드 (expr ....)에 해당하는 함수가 실행되어 응답을 보냅니다. 나는 이것이 분명히 희망한다. –