3

我目前正在尝试使用 FsLex 和 FsYacc 在 F# 中创建一个非常简单的解析器。起初,我试图实现的唯一功能是允许程序接收一个表示整数相加的字符串并输出结果。例如,我希望解析器能够接收“5 + 2”并输出字符串“7”。我只对字符串参数和输出感兴趣,因为一旦我扩展功能以支持更多操作,我想使用 Excel DNA 将解析器导入 Excel。但是,我目前正在努力让这个简单的整数加法正常工作。

我的 lexer.fsl 文件如下所示:

{
module lexer
open System
open Microsoft.FSharp.Text.Lexing
open Parser

let lexeme = LexBuffer<_>.LexemeString

let ops = ["+", PLUS;] |> Map.ofList
}

let digit = ['0'-'9']
let operator = "+"
let integ = digit+

rule lang = parse
    | integ 
    {INT(Int32.Parse(lexeme lexbuf))}
    | operator 
    {ops.[lexeme lexbuf]}

我的 parser.fsy 文件如下所示:

%{
open Program
%}

%token <int>INT
%token PLUS

%start input
%type <int> input

%%

input: 
    exp {$1}
;

exp: 
    | INT { $1 }
    | exp exp PLUS { $1 + $2 }
;

此外,我有一个 Program.fs 文件,它的作用类似于(非常小的)AST:

module Program

type value = 
    | Int of int

type op = Plus

最后,我有文件 Main.fs 应该测试解释器的功能(以及将函数导入 Excel)。

module Main

open ExcelDna.Integration
open System
open Program
open Parser

[<ExcelFunction(Description = "")>]
    let main () =
    let x = "5 + 2"
    let lexbuf = Microsoft.FSharp.Text.Lexing.LexBuffer<_>.FromString x
    let y = input lexer.lang lexbuf
    y

但是,当我运行此函数时,解析器根本不起作用。当我构建项目时,会正确创建 parser.fs 和 lexer.fs 文件。我觉得我缺少一些简单的东西,但我不知道如何正确地制作这个功能。

4

0 回答 0