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 }
Path.term이 우리의 인터프리터에 정의되어 있으므로 나는 괜찮을 것이라고 생각합니다. –
괜찮 았지만 무엇에 사용됩니까? 그리고 당신이하고 싶은 일과 관련이 있습니다 : "프로그램을 intrepret"? –
이 파일에는 lexer에 정의 된 키워드가 사용하는 모든 기능이 포함되어 있습니다. 그래서 내 프로그램에서 렉서 (lexer)에 정의 된 키워드를 호출하면, 파서에 의해 구문 분석되고, 구문 분석 된 키워드 (expr ....)에 해당하는 함수가 실행되어 응답을 보냅니다. 나는 이것이 분명히 희망한다. –