【发布时间】:2020-01-14 18:52:06
【问题描述】:
我对 F# 类型提供程序的理解是,它们实际上是从字符串到类型的编译时函数。该类型还可以附加静态方法,因此它们也可以用于代码生成。
在高层次上,这与解析器生成器工具(如 ANTLR)相同,后者采用语法文件并为目标语言生成代码。
所以我正在想象一个 F# 类型提供程序,它接受一个语法字符串并为 AST 和解析函数提供一个类型作为静态成员。
它可能看起来像这样:
[<Literal>]
let Grammar = "
program
: statement +
;
statement
: 'if' paren_expr statement
| 'if' paren_expr statement 'else' statement
| 'while' paren_expr statement
| 'do' statement 'while' paren_expr ';'
| '{' statement* '}'
| expr ';'
| ';'
;
paren_expr
: '(' expr ')'
;
expr
: test
| id '=' expr
;
test
: sum
| sum '<' sum
;
sum
: term
| sum '+' term
| sum '-' term
;
term
: id
| integer
| paren_expr
;
id
: STRING
;
integer
: INT
;
STRING
: [a-z]+
;
INT
: [0-9] +
;
WS
: [ \r\n\t] -> skip
;
"
type MyAst = AstProvider<Grammar>
let myAst = MyAst.TryParse("int x = 1;")
问题:
- 现在的类型提供者真的可以做到这一点吗?
- 是否有任何正在实施的示例?
【问题讨论】:
标签: f# type-providers