我试图在OCaml
中编写解释器,我在这里遇到问题。OCaml解释器:评估函数内部的函数
在我的计划,我想打电话给这样的函数,例如:
print (get_line 4) // print: print to stdout, get_line: get a specific line in a file
我怎么能这样做?问题出现在我们的解析器中,我认为是这样,因为它定义了程序将如何运行,函数是如何定义的以及程序的流程。这是我迄今为止在解析器中使用的一个词法分析器(代码如下),但似乎并不奏效。我真的没有看到我的代码和OCaml site上的计算器有任何区别,括号内的语句首先被评估,然后将其值返回到其父操作以进行下一次评估。
在我的翻译,功能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在我们的解释器中定义,所以它可以,我认为:) –
好的,但它用于什么?它与你想要做什么有关:“解释一个程序”? –
该文件包含我们在词法分析器中定义的关键字将使用的所有函数。所以当我调用在我的程序中的词法分析器中定义的关键字时,它将被解析器解析,然后与解析的关键字(在expr ....中)对应的函数将执行并给我答案。我希望这很清楚。 –