我一直在使用fslex和fsyacc,它们从lexer(.fsl
(和解析器(.fsp
(规则生成的F#源文件(.fs
(到处引用原始.fsl
(有时也引用相同的.fs
源文件(,语句如下(数字是行号(:
lex.fs
1 # 1 "/[PROJECT-PATH-HERE]/lex.fsp
...
16 # 16 "/PROJECT-PATH-HERE]/lex.fs
17 // This is the type of tokens accepted by the parser
18 type token =
19 | EOF
...
此外,pars.fsp
生成的.fs
文件也做同样的事情,只是额外引用了旁边生成的F#签名文件(.fsi
(。这意味着什么?
您在生成的代码中看到的注释是F#编译器指令(特别是"line"指令(。
"line"指令使得当F#编译器需要为生成的代码的某个部分发出警告/错误消息时,它可以确定原始文件的哪个部分对应于生成代码的那个部分。换句话说,F#编译器可以生成引用原始代码的警告/错误消息,该原始代码是导致错误的生成代码的基础。