diff options
Diffstat (limited to 'appl/spree/engines/liars.y')
| -rw-r--r-- | appl/spree/engines/liars.y | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/appl/spree/engines/liars.y b/appl/spree/engines/liars.y new file mode 100644 index 00000000..1e191076 --- /dev/null +++ b/appl/spree/engines/liars.y @@ -0,0 +1,132 @@ +%{ + + +YYSTYPE: adt { +}; + +YYLEX: adt { + lval: YYSTYPE; + lex: fn(l: self ref YYLEX): int; + error: fn(l: self ref YYLEX, err: string); + toks: list of string; +}; +%} + +%module Sh { + # module definition is in shell.m +} +%token A ALL AND BROKEN FIVE FOUR FUCK FULL HIGH +%token HOUSE KIND LOW NOTHING OF ON PAIR PAIRS STRAIGHT THREE TWO VALUE + +%start phrase +%% +phrase: nothing + | pair + | twopairs + | threes + | lowstraight + | fullhouse + | highstraight + | fours + | fives + +pair: PAIR + | PAIR ofsomething ',' extras + +nothing: NOTHING + | BROKEN STRAIGHT + | FUCK ALL + +twopairs: TWO PAIRS moretuppers + | TWO VALUE optcomma TWO VALUE and_a VALUE + | PAIR OF VALUE ',' PAIR OF VALUE and_a VALUE + +moretuppers: + | ',' VALUE ',' VALUE and_a VALUE + +threes: THREE OF A KIND extras + | THREE VALUE extras + +lowstraight: LOW STRAIGHT + +fullhouse: FULL HOUSE + | FULL HOUSE optcomma VALUE + | FULL HOUSE optcomma VALUE ON VALUE + | FULL HOUSE optcomma VALUE HIGH + +highstraight: HIGH STRAIGHT + +fours: FOUR OF A KIND extras + | FOUR VALUE extras + +fives: FIVE OF A KIND + | FIVE VALUE +and_a: # null + | AND A +optcomma: + | ',' +extras: VALUE + | extras VALUE +%% + +Tok: adt { + s: string; + tok: int; + val: int; +}; + +known := array of { +Tok("an", A, -1), +Tok("a", A, -1), +Tok("all", ALL, -1), +Tok("and", AND, -1), +Tok("broken", BROKEN, -1), +Tok(",", ',', -1), +Tok("five", FIVE, -1), +Tok("5", FIVE, -1), +Tok("four", FOUR, -1), +Tok("4", FOUR, -1), +Tok("fuck", FUCK, -1), +Tok("full", FULL, -1), +Tok("high", HIGH, -1), +Tok("house", HOUSE, -1), +Tok("kind", KIND, -1), +Tok("low", LOW, -1), +Tok("nothing", NOTHING, -1), +Tok("of", OF, -1), +Tok("on", ON, -1), +Tok("pair", PAIR, -1), +Tok("pairs", PAIRS, -1), +Tok("straight", STRAIGHT, -1), +Tok("three", THREE, -1), +Tok("3", THREE, -1), +Tok("two", TWO, -1), +Tok("2", TWO, -1), + +Tok("A", VALUE, 5), +Tok("K", VALUE, 4), +Tok("Q", VALUE, 3), +Tok("J", VALUE, 2), +Tok("10", VALUE, 1), +Tok("9", VALUE, 0), + +Tok("ace" +}; + +YYLEX.lex(l: self ref YYLEX): int +{ + if (l.toks == nil) + return -1; + t := hd l.toks; + for (i := 0; i < len known; i++) { + if (known[i].t0 == t) + return known[i].t1; + + case hd l.toks { + + +%token A ALL AND BROKEN FIVE FOUR FUCK FULL HIGH +%token HOUSE KIND LOW NOTHING OF ON PAIR PAIRS STRAIGHT THREE TWO VALUE +%token END + +}
\ No newline at end of file |
