Unfortunately I'm not familiar with Scala's combinator parser. If you could point me to a readable formal grammar and a sample input of what you're trying to parse, I'll try to help you with the FParsec parser. If you already have an F# AST, it would be good if you could post that too.
- Stephan
This should parse something like this DDL grammar (from SQL).
1
CREATE TABLE attributes (id INTEGER PRIMARY KEY, name TEXT, min NUMERIC, max NUMERIC, category INTEGER);CREATE TABLE database_version (version_number INTEGER);
I am starting to get more of the hang of it.
Here is the current mapping of Scala's to F#'s operators...
1 2 3
~ == >>. | == <|>
Full source for the parser is [link:github.com]
Sample text file that should parse
The next thing I need to figure out is how to create objects while parsing the code.
For instance the Scala code below matches the inputs and allows me to generate a type of object called Instruction. I am not quite sure how to get my matched strings from FParspec.
1 2
def instr: Parser[Instruction] = create ~ table ~ item ~ ColumnInfo ~ ";" ^^ {case create ~ table ~ itm ~ col ~ semi => new Instruction(create, table, CapitalizeFirstLetter(itm), col) }
The code above is basically saying for my grammar create ~ table .... do a match on the values and create a new instruction with these values. Make sense?
You can create objects by using the piping primitives "|>>" and "pipe2", "pipe3", ... Please have a look at the sample projects and the reference docs to see how these work.
Maybe the following (non-literal) translation of your parser to FParsec will help you a bit.
(Edit: Slightly changed the definitions of ws, name and charsBeforeEol)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
open System.Collections.Generic type DataType = | BINARY = 1 | BIGINT = 2 | BIT = 3 | CHAR = 4 | DATE = 5 | DATETIME = 6 | DATETIME2 = 7 | DECIMAL = 8 | FLOAT = 9 | IMAGE = 10 | INT = 11 | INTEGER = 12 | MONEY = 13 | NCHAR = 14 | NTEXT = 15 | NUMERIC = 16 | NVARCHAR = 17 | REAL = 18 | SMALLINT = 19 | SMALLMONEY = 20 | TEXT = 21 | TIME = 22 | TINYINT = 23 | VARBINARY = 24 | VARCHAR = 25 let dataTypeDict = let dict = new System.Collections.Generic.Dictionary<string, DataType>(32) for name in DataType.GetNames(typeof<DataType>) do dict.Add(name, unbox (System.Enum.Parse(typeof<DataType>, name))) dict type Column(name: string, dataType: DataType, isPrimaryKey: bool) = member t.Name = name member t.Type = dataType member t.IsPrimaryKey = isPrimaryKey override t.ToString() = sprintf "Column(name = %s, dataType = %s, isPrimaryKey = %b)" name (dataType.ToString()) isPrimaryKey type IsAdd = bool type Action = CreateTable of string * Column list | CreateIndex of string | AlterTable of string * IsAdd * string module Parser = open FParsec.Primitives open FParsec.CharParsers open FParsec.Error type Parser<'a> = Parser<'a,unit> let ws = skipManySatisfy (fun c -> c = ' ' || c = '\t') // whitespace let ch c = pchar c .>> ws let str s = pstring s .>> ws // stringCIReturn s s >>. ws // case insensitive alternative // a helper for parsing any constant in a dict let dictParser label (dict: Dictionary<string,'a>) (p: Parser<string>) = let error = messageError ("invalid " + label + " value") fun state -> let reply = p state if reply.Status = Ok then let mutable v = Unchecked.defaultof<'a> if dict.TryGetValue(reply.Result, &v) then Reply(v, reply.State) else Reply(Error, error, state) else Reply(reply.Status, reply.Error, reply.State) let dataType = let dataTypeStr = many1Satisfy isAsciiLetter .>> ws // |>> fun s -> s.ToUpperInvariant()) // case insensitive alternative dictParser "data type" dataTypeDict dataTypeStr let isNameFirstChar = fun c -> isAsciiLetter c || c = '_' let isNameChar = fun c -> isAsciiLetter c || isDigit c || c = '_' let name = many1Satisfy2L isNameFirstChar isNameChar "identifier" .>> ws let alter = str "ALTER" let create = str "CREATE" let index = str "INDEX" let table = str "TABLE" let eol = ch ';' >>. (skipNewline <|> eof) let charsBeforeEol = manySatisfy (fun c -> c <> ';' && c <> '\n') let parameter = pipe3 name dataType (opt (str "PRIMARY" >>. str "KEY")) (fun name dataType primaryKeyOpt -> Column(name, dataType, primaryKeyOpt.IsSome)) let columnInfo = between (ch '(') (ch ')') (sepBy parameter (ch ',')) let createTable = table >>. pipe2 name columnInfo (fun item paras -> CreateTable(item, paras)) let createIndex = index >>. charsBeforeEol |>> CreateIndex let createAction = create >>. (createTable <|> createIndex) let alterAction = let addOrDrop = str "ADD" <|> str "DROP" alter >>. table >>. pipe3 name addOrDrop charsBeforeEol (fun item addOrDrop rest -> AlterTable(item, addOrDrop = "ADD", rest)) let action = createAction <|> alterAction let file = many (spaces >>. action .>> eol) .>> eof let parseDDLFile filePath = runParserOnFile file () filePath System.Text.Encoding.Default let testString = @"CREATE TABLE attributes (id INTEGER PRIMARY KEY, name TEXT, min NUMERIC, max NUMERIC, category INTEGER); CREATE TABLE database_version (version_number INTEGER); CREATE TABLE data (id INTEGER PRIMARY KEY, letter TEXT ); CREATE TABLE events (start_day INTEGER, duration INTEGER ); CREATE INDEX idx_index ON attributes (don't care);" printf "%A" (FParsec.CharParsers.run Parser.file testString)
Thanks a lot Stephan. This has helped me out a lot.
I now understand the pipe operators as well. However, I know I am doing something wrong but not sure exactly what...
I have another grammar I am trying to parse. The grammar is
1
let testString = "PROJECT FILE\nVERSION: 5\n"
I want to verify the first line is PROJECT FILE but ignore it. I then want to parse VERSION: (but ignore it) and grab the value (which in this case is 5).
Everything seems to parse fine and I get a result of Success: () printed out. I also see that my object Version is created. But I am not sure how to access the object that is created. In the DDL example above everything prints out. In this case there is only the success printed out but not any data associated with it. Is this because my types for my parser is not correct? i.e. It is returning a unit? I appreciate the help and apologize for the newbie questions..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
type sparser = Parser<string, unit> type uparser = Parser<unit, unit> type Project = Version of int module test1 = let ws : uparser = skipManySatisfy (fun c -> c = ' ' || c = '\t') // whitespace let ch c = pchar c .>> ws let str s = pstring s .>> ws let skipStr s = skipString s .>> ws let eol = skipNewline let VersionValue : sparser = many1Chars digit let ProjectKeyword = skipStr "PROJECT FILE" let VersionKeyword = skipStr "VERSION:" let literal : sparser = asciiLetter <|> digit >>. manyChars (anyOf ":_\\/." <|> asciiLetter <|> digit) let versionval = VersionValue |>> (fun version -> Version(System.Convert.ToInt32(version))) let projFile = ProjectKeyword .>> eol .>> VersionKeyword .>> versionval .>> (eol <|> spaces) let file = (spaces >>. projFile) .>> eof let parseProjectFile fileName = runParserOnFile file () fileName System.Text.Encoding.Default let testString2 = "PROJECT FILE\nVERSION: 5\n" printfn "%A" (FParsec.CharParsers.run test1.file testString2)
You need to replace
1
VersionKeyword .>> versionval
with
1
VersionKeyword >>. versionval
, i.e. move the dot to the right-hand side. The dot marks the parser whose result is returned (and the operators .>>
and >>.
are both left-associative). Currenty projType
returns unit because it returns the result of
1
ProjectKeyword
instead of versionVal
.
Some more comments:
1
eol <|> spaces
can be simplified to
spaces
. (spaces
skips any space, tab or newline chars.)If the version number is indeed a simple integer, it is better to use
pint32
or a similar number parser in the1
VersionValue
parser.
You should prefer >>. to .>> if you don't need either of the results, e.g. use
1
let projFile = ProjectKeyword >>. eol >>. VersionKeyword >>. versionval .>> spaces
.
- There's no performance difference between pstring and skipString, so there isn't really a need for your skipStr parser.
And I hope this is the last question. I appreciate your patience and especially your answers.
Using the latest example above where I have a file with a header like this...
1 2 3 4
PROJECT FILE VERSION: 5 NAME: TEST PLATFORM: PC
It has to be in this order in the file and I want to populate a class called ProjectHeader with the version, name, and platform data. How do I go about this? In P-Code I would
- Create new ProjectHeader instance when I hit the text PROJECT FILE. Save that in the parser state.
- Parse the VERSION FIELD. Grab the parser state's ProjectHeader. Set the mutable field for version.
- Do the same for NAME and Platform.
However, I am not quite following how to set-up the heirarchy where it seems like I want a ProjectHeader parser that then contains a field(s) parser whereby the field parsers contain access to the ProjectHeader parser so they can grab out that state.
Also, if there is a more functional way to do this so I don't need to worry about state I am all ears as well.
Couldn't you just use something like the following?
1 2 3 4 5 6 7 8
let header = tuple4 projectType projectVersion projectName projectPlatform let body = (* parser for project body*) let project = pipe2 header body (fun (ty, ver, name, platform) body -> new Project(...)) let projects = many projects
Sweet!!! Thanks for the help. The light bulb (finally :) clicked on and have written most of my parser which is more detailed than the snippets above. Yeah!!! I now feel that I get most of the patterns.
What do you recommend doing if you have more than 5 parsers to pipe as there is only a pipe5?
You could for example group arguments as tuples. For example:
1 2 3
let pipe6 p1 p2 p3 p4 p5 p6 f = pipe5 p1 p2 p3 p4 (tuple2 p5 p6) (fun x1 x2 x3 x4 (x5, x6) -> f x1 x2 x3 x4 x5 x6))
Topic tags
- f# × 3705
- websharper × 1897
- compiler × 286
- functional × 201
- ui next × 139
- c# × 121
- classes × 97
- web × 97
- .net × 84
- book × 84
- async × 76
- ui.next × 67
- bug × 54
- core × 49
- website × 49
- server × 45
- parallel × 43
- ui × 43
- enhancement × 41
- parsing × 41
- testing × 41
- trywebsharper × 41
- typescript × 37
- html × 35
- javascript × 35
- owin × 35
- asynchronous × 30
- monad × 28
- ocaml × 28
- tutorial × 27
- warp × 27
- haskell × 26
- sitelet × 25
- linq × 22
- workflows × 22
- wpf × 20
- fpish × 19
- introduction × 19
- silverlight × 19
- sitelets × 19
- monodevelop × 17
- rpc × 17
- suave × 17
- piglets × 16
- collections × 15
- feature request × 15
- jquery × 15
- templates × 15
- getting started × 14
- pipeline × 14
- kendoui × 13
- reactive × 12
- 4.1.0.171 × 11
- monads × 11
- opinion × 10
- 4.0.190.100-rc × 9
- deployment × 9
- fixed × 9
- formlets × 9
- in × 9
- json × 9
- plugin × 9
- proposal × 9
- scheme × 9
- solid × 9
- basics × 8
- concurrent × 8
- highcharts × 8
- how-to × 8
- python × 8
- 4.1.1.175 × 7
- complexity × 7
- documentation × 7
- visual studio × 7
- 4.1.2.178 × 6
- lisp × 6
- real-world × 6
- released in 4.0.192.103-rc × 6
- remoting × 6
- resources × 6
- scala × 6
- websharper ui.next × 6
- workshop × 6
- xaml × 6
- 4.0.193.110 × 5
- 4.2.3.236 × 5
- aspnetmvc × 5
- authentication × 5
- azure × 5
- bootstrap × 5
- conference × 5
- dsl × 5
- formlet × 5
- java × 5
- list × 5
- metaprogramming × 5
- ml × 5
- released in Zafir.4.0.188.91-beta10 × 5
- sql × 5
- visualstudio × 5
- websharper.forms × 5
- zafir × 5
- 4.0.192.106 × 4
- 4.0.195.127 × 4
- 4.1.0.38 × 4
- 4.2.1.86 × 4
- 4.2.6.118 × 4
- css × 4
- example × 4
- extensions × 4
- fsi × 4
- fsx × 4
- html5 × 4
- jqueryui × 4
- lift × 4
- reflection × 4
- remote × 4
- rest × 4
- spa × 4
- teaching × 4
- template × 4
- websocket × 4
- wontfix × 4
- 4.0.196.147 × 3
- 4.1.0.34 × 3
- 4.1.6.207 × 3
- 4.2.1.223-beta × 3
- 4.2.11.258 × 3
- 4.2.4.114 × 3
- 4.2.4.247 × 3
- 4.2.5.115 × 3
- 4.2.6.253 × 3
- 4.2.9.256 × 3
- ajax × 3
- alt.net × 3
- aml × 3
- asp.net mvc × 3
- canvas × 3
- cloudsharper × 3
- compilation × 3
- database × 3
- erlang × 3
- events × 3
- extension × 3
- file upload × 3
- forums × 3
- inline × 3
- issue × 3
- kendo × 3
- macro × 3
- mono × 3
- msbuild × 3
- mvc × 3
- pattern × 3
- piglet × 3
- released in Zafir.4.0.187.90-beta10 × 3
- svg × 3
- type provider × 3
- view × 3
- 4.1.1.64 × 2
- 4.1.5.203 × 2
- 4.1.7.232 × 2
- 4.2.10.257 × 2
- 4.2.3.111 × 2
- 4.2.5.249 × 2
- android × 2
- asp.net × 2
- beginner × 2
- blog × 2
- chart × 2
- client × 2
- client server app × 2
- clojure × 2
- computation expressions × 2
- constructor × 2
- corporate × 2
- courses × 2
- cufp × 2
- d3 × 2
- debugging × 2
- direct × 2
- discriminated union × 2
- docs × 2
- elm × 2
- endpoint × 2
- endpoints × 2
- enterprise × 2
- entity framework × 2
- event × 2
- f# interactive × 2
- fable × 2
- flowlet × 2
- formdata × 2
- forms × 2
- fsc × 2
- google maps × 2
- hosting × 2
- http × 2
- https × 2
- iis 8.0 × 2
- install × 2
- interactive × 2
- interface × 2
- iphone × 2
- iteratee × 2
- jobs × 2
- jquery mobile × 2
- keynote × 2
- lens × 2
- lenses × 2
- linux × 2
- listmodel × 2
- mac × 2
- numeric × 2
- oauth × 2
- obfuscation × 2
- offline × 2
- oop × 2
- osx × 2
- packaging × 2
- pattern matching × 2
- performance × 2
- pipelines × 2
- q&a × 2
- quotation × 2
- reference × 2
- released in Zafir.4.0.185.88-beta10 × 2
- rx × 2
- script × 2
- security × 2
- self host × 2
- seq × 2
- sockets × 2
- stm × 2
- tcp × 2
- trie × 2
- tutorials × 2
- type × 2
- url × 2
- var × 2
- websharper.charting × 2
- websharper4 × 2
- websockets × 2
- wig × 2
- xna × 2
- zh × 2
- .net interop × 1
- 2012 × 1
- 4.0.194.126 × 1
- 4.1.3.184 × 1
- 4.1.4.189 × 1
- 4.2.0.214-beta × 1
- 4.2.12.259 × 1
- 4.2.2.231-beta × 1
- 4.2.8.255 × 1
- Canvas Sample Example × 1
- DynamicStyle Animated Style × 1
- Fixed in 4.0.190.100-rc × 1
- Released in Zafir.UI.Next.4.0.169.79-beta10 × 1
- SvgDynamicAttribute × 1
- WebComponent × 1
- abstract class × 1
- accumulator × 1
- active pattern × 1
- actor × 1
- addin × 1
- agents × 1
- aggregation × 1
- agile × 1
- alter session × 1
- animation × 1
- anonymous object × 1
- apache × 1
- api × 1
- appcelerator × 1
- architecture × 1
- array × 1
- arrays × 1
- asp.net 4.5 × 1
- asp.net core × 1
- asp.net integration × 1
- asp.net mvc 4 × 1
- asp.net web api × 1
- aspnet × 1
- ast × 1
- attributes × 1
- authorization × 1
- b-tree × 1
- back button × 1
- badimageformatexception × 1
- bash script × 1
- batching × 1
- binding-vars × 1
- bistro × 1
- body × 1
- bundle × 1
- camtasia studio × 1
- cas protocol × 1
- charts × 1
- clarity × 1
- class × 1
- cli × 1
- clipboard × 1
- clojurescript × 1
- closures × 1
- cloud × 1
- cms × 1
- coding diacritics × 1
- color highlighting × 1
- color zones × 1
- combinator × 1
- combinators × 1
- compile × 1
- compile code on server × 1
- config × 1
- confirm × 1
- content × 1
- context × 1
- context.usersession × 1
- continuation-passing style × 1
- coords × 1
- cordova × 1
- cors × 1
- coursera × 1
- cross-domain × 1
- csla × 1
- current_schema × 1
- custom content × 1
- data × 1
- data grid × 1
- datetime × 1
- debug × 1
- declarative × 1
- delete × 1
- devexpress × 1
- dhtmlx × 1
- dictionary × 1
- directattribute × 1
- disqus × 1
- distance × 1
- do binding × 1
- doc elt ui.next upgrade × 1
- docker × 1
- dojo × 1
- dol × 1
- dom × 1
- domain × 1
- du × 1
- duf-101 × 1
- dynamic × 1
- eastern language × 1
- eclipse × 1
- edsl × 1
- em algorithm × 1
- emacs × 1
- emotion × 1
- enums × 1
- error × 1
- etw × 1
- euclidean × 1
- eventhandlerlist × 1
- examples × 1
- ext js × 1
- extension methods × 1
- extra × 1
- facet pattern × 1
- failed to translate × 1
- fake × 1
- fantomas × 1
- fear × 1
- float × 1
- form × 1
- form-data × 1
- forum × 1
- fp × 1
- frank × 1
- fsdoc × 1
- fsharp × 1
- fsharp.core × 1
- fsharp.powerpack × 1
- fsharpx × 1
- fsunit × 1
- function × 1
- functional style × 1
- game × 1
- games × 1
- gc × 1
- generic × 1
- geometry × 1
- getlastwin32error × 1
- getting-started × 1
- google × 1
- google.maps × 1
- grid × 1
- group × 1
- guide × 1
- hash × 1
- headers × 1
- hello world example × 1
- heroku × 1
- highchart × 1
- history × 1
- how to × 1
- html-templating × 1
- http405 × 1
- httpcontext × 1
- hubfs × 1
- i18n × 1
- ie 8 × 1
- if-doc × 1
- iis × 1
- image × 1
- images × 1
- inheritance × 1
- initialize × 1
- input × 1
- install "visual studio" × 1
- installer × 1
- int64 × 1
- interfaces × 1
- internet explorer × 1
- interop × 1
- interpreter × 1
- io × 1
- iobservable × 1
- ios × 1
- iot × 1
- ipad × 1
- isomorphic × 1
- javascript optimization × 1
- javascript semanticui resources × 1
- jquery-plugin × 1
- jquery-ui × 1
- jquery-ui-datepicker × 1
- js × 1
- kendo datasource × 1
- kendochart × 1
- kendoui compiler × 1
- knockout × 1
- l10n × 1
- learning × 1
- library × 1
- libs × 1
- license × 1
- licensing × 1
- lineserieszonescfg × 1
- local setting × 1
- localization × 1
- logging × 1
- loop × 1
- macros × 1
- mailboxprocessor × 1
- mapping × 1
- maps × 1
- markerclusterer × 1
- markup × 1
- marshal × 1
- math × 1
- mathjax × 1
- message × 1
- message passing × 1
- message-passing × 1
- meta × 1
- metro style × 1
- micro orm × 1
- minimum-requirements × 1
- mix × 1
- mobile installation × 1
- mod_mono × 1
- modal × 1
- module × 1
- mouseevent × 1
- mouseposition × 1
- multidimensional × 1
- multiline × 1
- multithreading × 1
- mysql × 1
- mysqlclient × 1
- nancy × 1
- native × 1
- nested × 1
- nested loops × 1
- node × 1
- nunit × 1
- object relation mapper × 1
- object-oriented × 1
- om × 1
- onboarding × 1
- onclick × 1
- optimization × 1
- option × 1
- orm × 1
- os x × 1
- output-path × 1
- override × 1
- paper × 1
- parameter × 1
- persistence × 1
- persistent data structure × 1
- phonegap × 1
- pola × 1
- post × 1
- powerpack × 1
- prefix tree × 1
- principle of least authority × 1
- privacy × 1
- private × 1
- profile × 1
- programming × 1
- project × 1
- project euler × 1
- projekt_feladat × 1
- protected × 1
- provider × 1
- proxy × 1
- ptvs × 1
- public × 1
- pure f# × 1
- purescript × 1
- qna × 1
- quant × 1
- query sitelet × 1
- question × 1
- quotations × 1
- range × 1
- raphael × 1
- razor × 1
- rc × 1
- reactjs × 1
- real-time × 1
- ref × 1
- region × 1
- released in 4.0.190.100-rc × 1
- reporting × 1
- responsive design × 1
- rest api × 1
- rest sitelet × 1
- restful × 1
- round table × 1
- router × 1
- routing × 1
- rpc reverseproxy × 1
- runtime × 1
- sales × 1
- sample × 1
- sampleapp × 1
- scriptcs × 1
- scripting × 1
- search × 1
- self hosted × 1
- semanticui × 1
- sequence × 1
- serialisation × 1
- service × 1
- session-state × 1
- sharepoint × 1
- signals × 1
- sitelet website × 1
- sitelet.protect × 1
- sitlets × 1
- slickgrid × 1
- source code × 1
- sqlentityconnection × 1
- ssl × 1
- standards × 1
- static content × 1
- stickynotes × 1
- streamreader × 1
- stress × 1
- strong name × 1
- structures × 1
- submitbutton × 1
- subscribe × 1
- svg example html5 websharper.ui.next × 1
- sweetalert × 1
- system.datetime × 1
- system.reflection.targetinvocationexception × 1
- table storage × 1
- targets × 1
- tdd × 1
- templates ui.next × 1
- templating × 1
- text parsing × 1
- three.js × 1
- time travel × 1
- tls × 1
- tooltip × 1
- tracing × 1
- tsunamiide × 1
- turkish × 1
- twitter-bootstrap × 1
- type erasure × 1
- type inference × 1
- type providers × 1
- type-providers × 1
- typeprovider × 1
- ui next forms × 1
- ui-next × 1
- ui.next jqueryui × 1
- ui.next charting × 1
- ui.next formlets × 1
- ui.next forms × 1
- ui.next suave visualstudio × 1
- ui.next templating × 1
- unicode × 1
- unittest client × 1
- upload × 1
- usersession × 1
- validation × 1
- vb × 1
- vb.net × 1
- vector × 1
- view.map × 1
- visal studio × 1
- visual f# × 1
- visual studio 11 × 1
- visual studio 2012 × 1
- visual studio shell × 1
- vs2017 compiler zafir × 1
- vsix × 1
- web api × 1
- web-scraping × 1
- webapi × 1
- webcomponents × 1
- webforms × 1
- webgl × 1
- webrtc × 1
- webshaper × 1
- websharper async × 1
- websharper codemirror × 1
- websharper f# google × 1
- websharper forms × 1
- websharper reactive × 1
- websharper rpc × 1
- websharper sitelets routing × 1
- websharper warp × 1
- websharper-interface-generator × 1
- websharper.chartsjs × 1
- websharper.com × 1
- websharper.exe × 1
- websharper.owin × 1
- websharper.ui.next × 1
- websharper.ui.next jquery × 1
- websockets iis × 1
- why-websharper × 1
- windows 7 × 1
- windows 8 × 1
- windows-phone × 1
- winrt × 1
- www.grabbitmedia.com × 1
- xamarin × 1
- xml × 1
- yeoman × 1
- yield × 1
- zafir beta × 1
- zafir websharper4 × 1
- zarovizsga × 1
![]() |
Copyright (c) 2011-2012 IntelliFactory. All rights reserved. Home | Products | Consulting | Trainings | Blogs | Jobs | Contact Us | Terms of Use | Privacy Policy | Cookie Policy |
Built with WebSharper |
Hey all,
I have worked with and feel somewhat proficient in Scala's combinator parsers. However, I have not for some reason been able to make the syntax switch to FParsec and F#.
For instance, here is some code I wrote to parse some DDL (please note it handles limited grammars) in scala. This is a snippet of the actual code but a translation to FParsec would be helpful...even if it was just the first few lines.