The state of FParsec's documentation is currently quite unsatisfactory. I
have rough drafts of a tutorial and user guide for the next release of
FParsec, but unfortunately other priorities took over almost all my time
in the previous months. I'm hoping to find some time in the coming
weeks to finish the next release of FParsec, including the new documentation, but I can't promise
anything.
Some comments regarding your questions:
If I have two functional searcher
thing-a-ma-bobs, once they find their targets, how do I tell the system
to keep looking for their next matches?
Usually you use one of the variants of the `many` combinator to collect all matches.
Also, when adding these parsers in, the compiler can't infer the types,
so I get error messages for simple "let" statements -- until I hook them
all up later. That means there can be any combinatorial parser pieces
lying around unused? Sounds kind of weird.
You can avoid the error messages with a type annotation, for example:
1 2 3
type UserState = unit // assuming you don't need a user state type Parser<'Result> = Parser<'Result, UserState> let myParser : Parser<_> = pstring "test" // the ": Parser<_>" annotation prevents an error, if the compiler can't infer the type otherwise
And just what _are_ the arguments to these parsers and combinators,
anyway? Sometimes they stand alone, sometimes you have to give them an
integer, sometimes you have to put parenthesis around entire groups,
sometimes you don't. I understand that the answer to my question is in
the type signatures, but these are some seriously butt-ugly type
signatures. And from the tutorial and help pages I'm not always sure
which Parser<_,_> is doing what to whom.
Arguments to combinators can be other parsers or configuration parameters. Have you seen the reference documentation in the doc subfolder of the fparsec source tree at [link:bitbucket.org]? Could you give me an example for a "butt-ugly type signature", preferably together with a suggestion how to improve the signature?
I've got the simplest problem
imaginable: I have straight text I want to leave alone. Sprinkled
throughout the text I have "commands" which are delimited by #$# around
the Command Name. Basically it's just MadLibs.
All I need to do is leave the text alone, identify the commands, and run
them to find new text to insert in the stream.
One way to approach this problem is to parse the input as a sequence of tokens. The token can either be a text-snippet or a command. So you need a parser for a text snippedt and a parser for a command. The result type of both parsers could be an union type like "type Token = TextSnippet string | Command string". You can then combine both parsers into a parser for a token (e.g. "let token = textSnippet <|> command") and use something like "many token" to parse the complete document.
If you find FParsec with the current documentation too inaccessible, I'd suggest to write a simple recursive-descent parser in F# by hand. Your parsing problem seems easy enough, and writing a simple parser by hand can be quite instructive.
So I'll reply in-depth in a bit, just trying to do this first part.
It helped to bring up both projects as part of my solution and build them with my code. Because the type engine doesn't give the variable names assigned to the types, it's difficult to know what the Parser that you are providing as a parameter is supposed to do.
Right now I am trying to read blank text up to my command token, "#$#" So i figure I will copy this line directly from the tutorial and then change the ";;" to be my token, but it doesn't compile:
1
let r = (manyChars (notFollowedBy (pstring ";;") ";;" >>. anyChar) .>> pstring ";;")
I am also getting "invalid IL" errors, which are weird, and one of the reasons I brought all the code together in one spot. (This is being done on Mono)
To me the requirements seem quite simple: read all the text up until the command token. Return that as one chunk. Then read the text inside the command token. Return that as another chunk (of type Command). Repeat and Rinse. I'll walk the list later and run the commands to create the new text and then walk it a last time to reassemble the text. It's just MadLibs.
Here is my code so far.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
type FutonAst = TextSnippet of string | Command of string let commandToken = "#$#" let p_textPiece = let r = (manyChars (notFollowedBy (pstring ";;") ";;" >>. anyChar) .>> pstring ";;") r |>> TextSnippet let p_command = let r = between ((pstring "#$#") .>> spaces) ((pstring "#$#") .>> spaces) (FParsec.CharParsers.anyString 65536) r |>> Command let token = p_textPiece <|> p_command // OR combine being used, but doesn't show up in the html let parseFile = many (token) let testTxt (txt:string) = let result = FParsec.CharParsers.run parseFile txt match result with | Success(a,b,c)->printfn "success: %A" a | Failure (a,b,c) -> printfn "failed: %s" a //testTxt "this is one piece #$#dogs#$# This is another "
I apologize if I seem a little stressed. This is a great library and I want to learn it. While I can write a parser probably very easily, it's better to have all these little parser units done for me, it's easier to combine them in these chains, and I'd much rather use a big hunk of code that does everything I need instead of having to roll it all on my own.
This can't be that difficult. It seems I "almost" have it, but just not quite. The |>> operator has failed several times, and beats me exactly what it does (except turn a string into a discriminated union type) So it's hard for me to figure out what it might be doing wrong. Perhaps in some of my previous code I was confusing char lists with strings, having one parser return a list of char and another return a string. It seems very difficult to have the system just return a string up until my command token without consuming the token, but that's a very easy request. i must be missing something.
The not-followed-by parser is missing an L, it must be (notFollowedByL (pstring ";;") ";;")
The command parser can't work, because the "anyString N" parser will try to parse a string with exactly N chars.
Below is a working parser (without whitespace stripping).
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
open FParsec.Primitives open FParsec.CharParsers type FutonAst = TextSnippet of string | Command of string let maxLength = System.Int32.MaxValue let delim = "#$#" let textSnippet = many1Chars (notFollowedByString "#$#" >>. anyChar) |>> TextSnippet let command = skipString "#$#" >>. charsTillString "#$#" System.Int32.MaxValue |>> Command let token = textSnippet <|> command let tokens = many token let testTxt (txt: string) = let result = FParsec.CharParsers.run tokens txt match result with | Success(result, _, _) -> printfn "success: %A" result | Failure(msg, _, _) -> printfn "failed: %s" msg do testTxt "this is one piece #$#dogs#$# This is another "
This is not the most efficient way to parse this grammar, but it does the job.
Thanks Stephan. It always helps to have a working example that does what you want in order to learn. Very much appreciated.
Now, for the bad part. I have code that compiles, but I still get the IL error. I'm going to dump the code and the error here for those of you interested in why mono is barfing.
Perhaps it's my build, or my environment -- I'm new to linux and thrashed around quite a bit getting everything set up. I may attempt to build this is in windows and just move the dlls over, as I guess it might be more of a compile-time IL generation problem than a runtime problem. Or I may just write my own parser. Not a happy spot to be in after spending this much time on it.
Here's the code. This is the fsx version. This compiles just fine in an .fs file, and when entering it by hand into F# interactive, it goes in fine (Note that I type-annotated a couple of the parsers to keep the interpreter from barfing)
But when I run the last line -- the part that actually parses the string -- it crashes and burns. Dump attached after the code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#r "/home/daniel/Dropbox/source/Futon/FutonAlpha/FParsecCS/bin/Debug/FParsecCS.dll";; #r "/home/daniel/Dropbox/source/Futon/FutonAlpha/FParsec/bin/Debug/FParsec.dll";; open FParsec.Primitives;; open FParsec.CharParsers;; open FParsec.OperatorPrecedenceParser;; type FutonAst = TextSnippet of string | Command of string;; let maxLength = System.Int32.MaxValue;; let delim = "#$#";; let textSnippet:Parser<FutonAst,unit> = many1Chars (notFollowedByString "#$#" >>. anyChar) |>> TextSnippet;; let command:Parser<FutonAst, unit> = skipString "#$#" >>. charsTillString "#$#" System.Int32.MaxValue |>> Command;; let token = textSnippet <|> command;; let tokens = many token;; let testTxt (txt: string) = let result = FParsec.CharParsers.run tokens txt match result with | Success(result, _, _) -> printfn "success: %A" result | Failure(msg, _, _) -> printfn "failed: %s" msg;; do testTxt "this is one piece #$#dogs#$# This is another ";;
Here's the stack trace
1 2 3 4 5 6 7 8 9 10 11 12 13 14
System.InvalidProgramException: Invalid IL code in FParsec.CharParsers/many1Chars2@819-2:Invoke (FParsec.State`1</i>): IL_004d: stloc.s 5 at FParsec.Primitives+op_BarGreaterGreater@151-2[Microsoft.FSharp.Core.Unit,FSI_0005+FutonAst,System.String].Invoke (FParsec.State`1 state) [0x00000] in <filename unknown>:0 at FParsec.Primitives+op_LessBarGreater@240-2[FSI_0005+FutonAst,Microsoft.FSharp.Core.Unit].Invoke (FParsec.State`1 state) [0x00000] in <filename unknown>:0 at FParsec.Primitives+many@780-14[Microsoft.FSharp.Core.Unit,FSI_0005+FutonAst].Invoke (FParsec.State`1 state) [0x00000] in <filename unknown>:0 at FParsec.CharParsers.applyParser[FSharpList`1,Unit] (Microsoft.FSharp.Core.FSharpFunc`2 parser, FParsec.State`1 state) [0x00000] in <filename unknown>:0 at FParsec.CharParsers+runParserOnString@80-2[Microsoft.FSharp.Collections.FSharpList`1[FSI_0005+FutonAst],Microsoft.FSharp.Core.Unit].Invoke (Microsoft.FSharp.Core.FSharpFunc`2 parser, FParsec.State`1 state) [0x00000] in <filename unknown>:0 at FParsec.Helper.RunParserOnString[ParserResult`2,FSharpFunc`2,Unit] (System.String str, Int32 index, Int32 length, Microsoft.FSharp.Core.FSharpFunc`2 applyParser, Microsoft.FSharp.Core.FSharpFunc`2 parser, Microsoft.FSharp.Core.Unit userState, System.String streamName) [0x00000] in <filename unknown>:0 at FParsec.CharParsers.runParserOnString[FSharpList`1,Unit] (Microsoft.FSharp.Core.FSharpFunc`2 parser, Microsoft.FSharp.Core.Unit ustate, System.String streamName, System.String chars) [0x00000] in <filename unknown>:0 at FParsec.CharParsers.run[FSharpList`1] (Microsoft.FSharp.Core.FSharpFunc`2 parser, System.String string) [0x00000] in <filename unknown>:0 at FSI_0012.testTxt (System.String txt) [0x00000] in <filename unknown>:0 at <StartupCode$FSI_0013>.$FSI_0013.main@ () [0x00000] in <filename unknown>:0 at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (object,object[],System.Exception&) at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in <filename unknown>:0 Stopped due to error
Update: The code runs fine on Windows. But no matter how I try, I can't get it to run on Ubuntu mono 2.6.7 due to IL errors.
Just thought I could save somebody else out there some time. I don't think you can get there from here.
Hi,
The "invalid IL" error is annoying. Could you check you're using a recent version of Mono (at least 2.8) and latest F# version (November 2010 update, either from Codeplex or from MSDN)?
It would be good to get a small repro of this, so that the bug can be fixed.
Laurent.
I'm running mono 2.6.7, which is the only build I can find for Ubuntu Lynx. 2.8.2 looks like it's for VMWare, VirtualPC, MacOS, Solaris -- everything but Ubuntu
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 |
I've written several programs in F#, and although I come from an extensively imperative background, I'm not a noob by any means.
But dang this FParsec is tough. I read the tutorial three times. I get the idea that you chain together functions, sort of like regex, and then you can cast the results into your AST.
What I don't get is things like: If I have two functional searcher thing-a-ma-bobs, once they find their targets, how do I tell the system to keep looking for their next matches? I think this is in the structure of how the parsers are set up, but the simple one-line examples don't really answer that.
Also, when adding these parsers in, the compiler can't infer the types, so I get error messages for simple "let" statements -- until I hook them all up later. That means there can be any combinatorial parser pieces lying around unused? Sounds kind of weird.
And just what _are_ the arguments to these parsers and combinators, anyway? Sometimes they stand alone, sometimes you have to give them an integer, sometimes you have to put parenthesis around entire groups, sometimes you don't. I understand that the answer to my question is in the type signatures, but these are some seriously butt-ugly type signatures. And from the tutorial and help pages I'm not always sure which Parser<_,_> is doing what to whom.
So is there another resource for FParsec? I've got the simplest problem imaginable: I have straight text I want to leave alone. Sprinkled throughout the text I have "commands" which are delimited by #$# around the Command Name. Basically it's just MadLibs.
All I need to do is leave the text alone, identify the commands, and run them to find new text to insert in the stream. This shouldn't be rocket science. Heck, it shouldn't be but a few lines of code. But it's got me baffled.
Any help is greatly appreciated. I've been at this for a couple of days with mixed results and I really hope you guys can offer some assistance.