- Home
- Products
- Integration
- Tutorial
- Barcode FAQ
- Purchase
- Company
CH A PT ER 1 6 LEXI NG A ND PARS IN G in Font
CH A PT ER 1 6 LEXI NG A ND PARS IN G Print PDF-417 2d Barcode In None Using Barcode generator for Font Control to generate, create PDF-417 2d barcode image in Font applications. www.OnBarcode.comCreating Data Matrix In None Using Barcode creator for Font Control to generate, create Data Matrix image in Font applications. www.OnBarcode.com[Assign ("counter",Int 100); Assign ("accum",Int 0); While (Val "counter", Seq [Assign ("counter",Minus (Val "counter",Int 1)); Assign ("accum",Plus (Val "accum",Val "counter"))]); Print Val "accum"] Writing an evaluator for Kitty is straightforward. Here we utilize an environment that maps variable names to the integer values they store. As you expect, assignments in the source language add a binding for a given variable, and evaluating variables reads a value from this environment. Because of the lack of other types in Kitty, we use a nonzero value for the Boolean true and zero for false and wire the logic of the conditional and looping construct accordingly: let rec evalE (env: Map<string, int>) = function | Val v -> if env.ContainsKey v then env.[v] else failwith ("unbound variable: " + v) | Int i -> i | Plus (e1, e2) -> evalE env e1 + evalE env e2 | Minus (e1, e2) -> evalE env e1 - evalE env e2 | Times (e1, e2) -> evalE env e1 * evalE env e2 and eval (env: Map<string, int>) = function | Assign (v, e) -> env.Add(v, evalE env e) | While (e, body) -> let rec loop env e body = if evalE env e <> 0 then loop (eval env body) e body else env loop env e body | Seq stmts -> List.fold_left eval env stmts | IfThen (e, stmt) -> if evalE env e <> 0 then eval env stmt else env | IfThenElse (e, stmt1, stmt2) -> if evalE env e <> 0 then eval env stmt1 else eval env stmt2 | Print e -> print_int (evalE env e); env With these at hand, continuing the same interactive session, you can now evaluate the sample Kitty program: > match parseText sample with | Prog stmts -> eval Map.empty (Seq stmts) |> ignore;; 4950 val it : unit = () Printing Code 3/9 In None Using Barcode maker for Font Control to generate, create ANSI/AIM Code 39 image in Font applications. www.OnBarcode.comBarcode Creation In None Using Barcode generation for Font Control to generate, create Barcode image in Font applications. www.OnBarcode.comCHAPTER 16 LEXING A ND PARS ING
Drawing Denso QR Bar Code In None Using Barcode creator for Font Control to generate, create QR Code image in Font applications. www.OnBarcode.comGenerating EAN13 In None Using Barcode generation for Font Control to generate, create EAN-13 image in Font applications. www.OnBarcode.comIf necessary, you can also compile the AST, the lexer, and the parser together into a DLL or as part of an EXE: fsc a o KittySyntax.dll kittyAst.fs kittyParser.fs kittyLexer.fs Barcode Printer In None Using Barcode generator for Font Control to generate, create Barcode image in Font applications. www.OnBarcode.comCode 93 Full ASCII Creation In None Using Barcode generation for Font Control to generate, create USS Code 93, USS 93 image in Font applications. www.OnBarcode.comBinary Parsing and Pickling Using Combinators
PDF-417 2d Barcode Printer In None Using Barcode maker for Font Control to generate, create PDF-417 2d barcode image in Font applications. www.OnBarcode.comCreating PDF-417 2d Barcode In .NET Using Barcode generator for Reporting Service Control to generate, create PDF-417 2d barcode image in Reporting Service applications. www.OnBarcode.comThere is one final case of parsing that is common when working with binary data. That is, say you want to work with a format that is conceptually relatively easy to parse and generate (such as a binary format) but where the process of actually writing the code to crack and encode the format is somewhat tedious. In this section, we cover a useful set of techniques to write readers and writers for binary data quickly and reliably. As the running example, we will show a set of pickling (also called marshalling) and unpickling combinators to generate and read a binary format of our own design. The combinators can easily be adapted to work with existing binary formats such as those used for network packets. Picklers and unpicklers for different data types will be function values that have signatures as follows: type outstate = System.IO.BinaryWriter type instate = System.IO.BinaryReader type pickler<'a> = 'a -> outstate -> unit type unpickler<'a> = instate -> 'a Here instate and outstate are types that will record information during the pickling or parsing process. In this section, these are just binary readers and writers, but more generally they can be any type that can collect information and help compact the data during the writing process, such as by ensuring that repeated strings are given unique identifiers during the pickling process. At the heart of every such library lies a set of primitive leaf functions for the base cases of aggregate data structures. For example, when working with binary streams, this is the usual set of primitive read/write functions: let byteP (b: byte) (st: outstate) = st.Write(b) let byteU (st: instate) = st.ReadByte() You can now begin to define additional pickler/unpickler pairs: let boolP b st = byteP (if b then 1uy else 0uy) st let boolU st = let b = byteU st in (b = 1uy) let int32P i st byteP (byte byteP (byte byteP (byte byteP (byte = (i &&& 0xFF)) st ((i >>> 8) &&& 0xFF)) st ((i >>> 16) &&& 0xFF)) st ((i >>> 24) &&& 0xFF)) st Make Barcode In .NET Framework Using Barcode generator for .NET Control to generate, create Barcode image in .NET applications. www.OnBarcode.comEncode Barcode In None Using Barcode encoder for Software Control to generate, create Barcode image in Software applications. www.OnBarcode.comCreating 1D Barcode In Java Using Barcode encoder for Java Control to generate, create 1D image in Java applications. www.OnBarcode.comGenerate Code 128 Code Set B In None Using Barcode creation for Software Control to generate, create Code 128 Code Set C image in Software applications. www.OnBarcode.comData Matrix 2d Barcode Generator In VB.NET Using Barcode printer for VS .NET Control to generate, create Data Matrix image in Visual Studio .NET applications. www.OnBarcode.comDataMatrix Reader In None Using Barcode reader for Software Control to read, scan read, scan image in Software applications. www.OnBarcode.comGenerate Denso QR Bar Code In Visual C#.NET Using Barcode drawer for Visual Studio .NET Control to generate, create QR Code 2d barcode image in VS .NET applications. www.OnBarcode.comBarcode Decoder In None Using Barcode decoder for Software Control to read, scan read, scan image in Software applications. www.OnBarcode.comDecoding EAN13 In Visual Basic .NET Using Barcode scanner for .NET framework Control to read, scan read, scan image in VS .NET applications. www.OnBarcode.comCode 128B Printer In None Using Barcode printer for Online Control to generate, create USS Code 128 image in Online applications. www.OnBarcode.com |
|