我学习 F# 已经有一段时间了,我想尝试创建一个小型 SQL 解析器。我找到了一个教程,它解释了如何通过 FsLex 和 FsYacc 执行此操作,但是,该站点没有提供任何下载链接。在 Visual Studio 下,通过 nuget,我遇到了这个,然后我下载了它。它似乎与网站提供的解释非常相似,所以我认为这与问题无关。
我离它不远了,这是我的两个小文件:
Sql.fs:
module Sql
type value =
| Int of int
| Float of float
| String of string
type dir = Asc | Desc
type op = Eq | Gt | Ge | Lt | Le
type order = string * dir
type where =
| Cond of (value * op * value)
| And of where * where
| Or of where * where
type joinType = Inner | Left | Right
type join = string * joinType * where option
type sqlStatement =
{
Table : string;
Columns : string list;
Joins : join list;
Where : where option;
OrderBy : order list
}
SqlParser.fsp:
module SqlParser
%{
open Sql
%}
%token <string> ID
%token <int> INT
%token <float> FLOAT
%token AND OR
%token COMMA
%token EQ LT LE GT GE
%token JOIN INNER LEFT RIGHT ON
%token SELECT FROM WHERE ORDER BY
%token ASC DESC
%token EOF
// start
%start start
%type <string> start
%%
start:
| { "Nothing to see here" }
%%
这是我的项目的文件/参考列表:
References:
- FSharp.Core
- FsLexYacc.Runtime
- mscorlib
- System
- System.Core
- System.Numerics
- System.ValueTuple
AssemblyInfo.fs
Sql.fs
SqlParser.fsp
App.config
packages.config
这是预构建命令,它应该与“SqlParser.fsp”文件交互:
fsyacc "$(ProjectDir)SqlParser.fsp"
当我使用这个命令编译时,Visual Studio 告诉我“生成失败”,但没有错误,这些列表是空的。当我删除此命令时,项目“正常”编译,实际上文件“SqlParser.fsp”应该生成其他文件(因此是 prebuild 命令)。
- 我错过了什么吗?
- FsLexYacc 库是否已过时?
- 教程不对吗?
- ...
先感谢您。