在F#中创建简单的解析器

时间:2015-07-14 13:56:59

标签: parsing f# excel-dna fsyacc fslex

我目前正在尝试使用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文件。我觉得我缺少一些简单的东西,但我不知道如何正确地使用这个功能。

0 个答案:

没有答案