/usr/share/doc/frown-doc/examples/other/VarType.g is in frown-doc 0.6.1-13.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 | {-
The following unambiguous grammar has a reduce/reduce conflict.
frown --debug Type.g
Try
tType [Int, LPAR, RPAR] :: [()]
tType [Int, LPAR, Num, RPAR] :: [()]
Nice example for the use of nondeterminism.
Alternatively, we can use 2 tokens of lookahead. As the grammar is
LR(2) this yields a deterministic parser.
frown --debug --lookahead=2 Type.g
Try
tType [Int, LPAR, RPAR] >>= print
tType [Int, LPAR, Num 9, RPAR] >>= print
-}
module VarType
where
import Monad
type Result = IO
%{
Terminal = Int | Char | Void | "(" = LPAR | ")" = RPAR | Num {Int};
Nonterminal = tType | aType | vType | aBasicType | aSize | vBasicType | vSize;
tType : aType;
| vType;
aType : aBasicType, aSize;
vType : vBasicType, vSize;
aBasicType : Int;
| Char;
aSize : "(", Num {n}, ")";
vBasicType : Int;
| Char;
| Void;
vSize : "(", ")";
}%
data Terminal = Int | Char | Void | LPAR | RPAR | Num Int
frown _ = fail "syntax error"
|