views8
comments
Do you mean something like
1 2 3 4 5 6 7 8 9 10 11
let If predicate (p: Parser<_,_>) : Parser<_,_> = fun stream -> let state = stream.State let reply = p stream if reply.Status <> Ok || predicate reply.Result then reply else stream.BacktrackTo(state) Reply(Error, NoErrorMessages) let pverb = verb |> If lexeme.IsVerb
?
oooh- That is super fancy and most definitely what I am looking for. It does look similar to some of your examples in the documentation, but I wasn't sure how to translate my desire into fparsec code. Thanks again for your prompt help and fabulous project. I am really liking programming my parser in fparsec!
Thanks,
Scott
bummer- that didn't work. It seems that my verb binding is really returning a Parser<Lexeme, UserState> instead of just a Lexeme. Stranger still when I try your code that you posted it failes because it thinks the lexeme you are passing to the If binding is an object rather than a Lexeme. Is there something else I can try?
Thanks,
Scott
Could you provide a minimal complete example that I can try to make work?
// C# Language Class Library
// Lexeme.cs
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
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Poc.Language { public class Lexeme<TItem> where TItem : Verb { public Lexeme(int dot, params TItem[] items) { Dot = dot; _Items = items; } public bool IsMatched { get { return _Items != null && _Items.Length > 0 ? _Items.Any(item => item.IsMatched(Dot)) : false; } } public int Dot { get; set; } public TItem Item { get { return _Items != null && _Items.Length > 0 ? _Items[0] : null; } } public TItem[] Items { get { return _Items; } } private TItem[] _Items; } }
// Manager.cs
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
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Poc.Language { public class Manager { public Manager() { Verb open = new Verb("open"); Verb set = new Verb("set"); Verb delete = new Verb("delete"); var verbs = new Registry<Verb>(); verbs.Register(new Verb[] { open, set, delete }); _VerbRegistry = verbs; } public Lexeme<Verb> FindVerb(string name) { return _VerbRegistry.Find(name); } public Registry<Verb> GetVerbRegistry() { return _VerbRegistry; } private Registry<Verb> _VerbRegistry; } }
// Registry.cs
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
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Poc.Language { public class Registry<TItem> where TItem : Verb { public Registry(params TItem[] items) { Register(items); } public void Register(params TItem[] items) { _Items.AddRange(items); } public void Unregister(params TItem[] items) { items.ToList().ForEach(item => _Items.Remove(item)); } public Lexeme<TItem> Find(string text) { Lexeme<TItem> lexeme = null; if (string.IsNullOrWhiteSpace(text)) { int dot = text.Length; var items = _Items.Where(item => item.Name.Length >= dot && item.Name.Substring(0, dot).Equals(text)).ToArray(); lexeme = new Lexeme<TItem>(dot, items); } return lexeme; } private List<TItem> _Items = new List<TItem>(); } }
// Verb.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Poc.Language { public class Verb { public Verb() : this(null) { } public Verb(string name) { Name = name; } public string Name { get; internal set; } public bool IsMatched(int dot) { if (0 <= dot && dot < Name.Length) return false; return true; } } }
// F# Parser Class Library (include ref to Language.dll)
// Ast.fs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
namespace Poc.Parser open System open FParsec open Poc.Language type UserState = unit type Parser<'t> = Parser<'t, UserState> type Ident = string type Expr = | Var of Ident | Int of int | Float of float32 | Double of double | String of string | Oper of Expr * Expr list | Verb of Lexeme<Verb> | Verbs of Lexeme<Verb>
// Parser.fs
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 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
namespace Poc.Parser open System open System.Collections.Generic open FParsec open FParsec.Primitives open FParsec.CharParsers open Poc.Language type nf = System.Text.NormalizationForm type Parser() = let manager = new Manager() let ws : Parser<_> = spaces let ch c = skipChar c >>. ws let str s = pstring s .>> ws let lparen = ch '(' let rparen = ch ')' let tab = pchar '\t' let space = pchar ' ' let comma = pchar ',' let period = pchar '.' let newline = pchar '\n' let underscore = pchar '_' let identStart c = isAsciiLetter c || c = '_' let identContinue c = isAsciiLetter c || isDigit c || c = '_' let identOptions = IdentifierOptions( isAsciiIdStart = identStart, isAsciiIdContinue = identContinue, normalization = nf.FormKC, normalizeBeforeValidation = true) let ident = identifier identOptions let pident = ident |>> Expr.Var let stringStart c = isAsciiLetter c || isDigit c || c = '_' let stringContinue c = isAsciiLetter c || isDigit c || c = '_' || c = ' ' let stringOptions = IdentifierOptions( isAsciiIdStart = stringStart, isAsciiIdContinue = stringContinue, normalization = nf.FormKC, normalizeBeforeValidation = true) let string = identifier stringOptions let pstring = string |>> Expr.String let aoc2str aoc = new System.String(Array.ofList aoc) // -?[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)? let numberFormat = NumberLiteralOptions.AllowMinusSign ||| NumberLiteralOptions.AllowFraction ||| NumberLiteralOptions.AllowExponent ||| NumberLiteralOptions.AllowSuffix let number = numberLiteral numberFormat "number" |>> fun nl -> if nl.IsInteger then Expr.Int (int32 nl.String) elif nl.IsDecimal && Char.ToLower(nl.SuffixChar1) = 'f' then Expr.Float (float32 nl.String) else Expr.Double (double nl.String) let opp = new OperatorPrecedenceParser<_,_,_>() let exprNoComma = opp.ExpressionParser let var = sepBy1 exprNoComma (ch ',') |>> (List.reduce (fun acc e -> Oper(Var ",", [acc;e]))) let vars = many var let parenExpr = between lparen rparen var let prim = choice [parenExpr;pident;number;pstring] let argList = sepBy exprNoComma (ch ',') let oper = between lparen rparen argList |>> (fun args fct -> Oper(fct, args)) let simpleExpr = pipe2 prim (many oper) (fun prim ops -> List.fold (fun acc elt -> elt acc) prim ops) do opp.TermParser <- simpleExpr let precedence1 = [ ["*"; "/"; "%"], Associativity.Left ["+"; "-"], Associativity.Left ["<<"; ">>"], Associativity.Left ["<"; ">"; "<="; ">="], Associativity.Left ["=="; "!="], Associativity.Left ["&"], Associativity.Left ["^"], Associativity.Left ["|"], Associativity.Left ["&&"], Associativity.Left ["^^"], Associativity.Left ["||"], Associativity.Left ] let precedence2 = [ ["="; "+="; "-="; "*="; "/="; "%="; "<<="; ">>="; "&="; "^="; "|="], Associativity.Right ] // Add all the operators in the OperatorParser let makeOperator = // we start with operators with highest priority, then we decrement the counter. let precCounter = ref 20 //(we have at most 20 different priorities) let addInfix li = for ops, assoc in li do decr precCounter for op in ops do opp.AddOperator(InfixOperator(op, ws, !precCounter, assoc, fun x y -> Oper(Var op, [x; y]))) let addPrefix() = decr precCounter for op in ["++"; "--"; "+"; "-"; "~"; "!"] do opp.AddOperator(PrefixOperator(op, ws, !precCounter, true, fun x -> Oper(Var op, [x]))) let addPostfix() = decr precCounter for op in ["++"; "--"] do // the '$' prefix in the name is a trick to distinguish ++a from a++ in the AST opp.AddOperator(PostfixOperator(op, ws, !precCounter, true, fun x -> Oper(Var ("$"+op), [x]))) addPostfix() addPrefix() addInfix precedence1 decr precCounter opp.AddOperator(TernaryOperator("?", ws, ":", ws, !precCounter, Associativity.Right, fun x y z -> Oper(Var "?:", [x;y;z]))) addInfix precedence2 let lookup (registry : Registry<_>, text : string) = let result = registry.Find(text) result let If predicate (parser : Parser<_,_>) : Parser<_,_> = fun stream -> let state = stream.State let reply = parser stream if reply.Status <> Ok || predicate reply.Result then reply else stream.BacktrackTo(state) Reply(Error, NoErrorMessages) let verb = ident .>> ws |>> fun i -> let registry = manager.GetVerbRegistry() let lexeme = lookup(registry, i) lexeme let pverb = verb |>> Expr.Verb // <-- wrong let pverb = verb |> If lexeme.IsMatched |> Expr.Verb // <-- based on your suggestion let pverbs = verb |> If !lexeme.IsMatched |> Expr.Verbs let run parser (input : string) = runParserOnString parser () "" input let parseVerb = ws >>. pverb .>> eof member this.ParseVerb(input : string) = let result = run parseVerb input match result with | Success(v,_,_) -> v | Failure(msg,_,_) -> System.Console.WriteLine(msg) exit 1
// C# Console Application (include refs to Language.dll and Parser.dll)
// Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Poc.Language; using Poc.Parser; namespace ParserProofOfConcept2 { class Program { static void Main(string[] args) { Parser parser = new Parser(); var result = parser.ParseVerb("ope"); } } }
This is the absolute minimal set of code that represents what I am doing, with the lone exception that you could combine all of the cs class definitions into one file. I am assuming if you want to do that the way I have broken it up won't stop you. ;)
Thanks for taking the time to look at it, Stephan
-Scott
There's a simple error in my previous answer.
Does maybe
1
let pverb = verb |> If (fun lexeme -> lexeme.IsVerb) |>> Expr.Verb
work for you?
I didn't have time to look at your whole example.
That did it and gave me some ideas on how to solve my problem...
Thanks,
Scott
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 only want fail without consuming input if it doesnt match the condition. However, instead of building the matching out of raw parsers,
in this case I want to do a lookup that tells me if the input is 'in; the grammar. Thanks for any help or hints anyone can provide... ;)
Scott