0

FsLexYacc にレクサーとパーサーを実装しています。レクサーをデバッグするために、特定の文字列のすべてのトークンを出力したいと考えています。

これが私がこれまでに持っているものです:

#load "../.paket/load/net5.0/FsLexYacc.Runtime.fsx"

#load "./Domain.fs"
#load "./Parser.fs"
#load "./Lexer.fs"

open System
open System.IO
open FSharp.Text
open FSharp.Text.Lexing
open Scripting

let allTokens (input : string) =
  let lexBuffer = LexBuffer<char>.FromString input
  Lexer.tokenize lexBuffer // Only gets first token!

printfn "%A" <| allTokens "1 + 1"

ナンバー1

しかし、これは最初のトークンにすぎません!

すべてのトークンをリストまたはシーケンスとして取得するにはどうすればよいですか?

4

1 に答える 1

1

Lexer.tokenizeより多くのトークンを取得するために繰り返し呼び出すことができます。

通常、レクサー定義eofはファイルの最後に到達すると一致し、「ファイルの終わり」を示す特定のトークンを返す場合があります。

let tokenize = parse
    ... 
   | eof -> { Token.EOF }

その場合、EOFトークンを受け取るまで Lexer.tokenize を呼び出すだけでかまいません。もちろん、これは反復的、再帰的に、またはビルトインを作成することによって行うことができます。

let allTokens = 
    Seq.initInfinite (fun _ -> Lexer.tokenize lexBuffer)
    |> Seq.takeWhile ( (<>) Token.EOF )

let rec allTokens = 
    match Lexer.tokenize lexBuffer with
    | Token.EOF -> []
    | t -> t :: allTokens
于 2021-11-21T23:11:55.597 に答える