2

我学习 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 库是否已过时?
  • 教程不对吗?
  • ...

先感谢您。

4

0 回答 0