1 | using System; |
---|
2 | |
---|
3 | namespace antlr |
---|
4 | { |
---|
5 | /*ANTLR Translator Generator |
---|
6 | * Project led by Terence Parr at http://www.jGuru.com |
---|
7 | * Software rights: http://www.antlr.org/license.html |
---|
8 | * |
---|
9 | * $Id:$ |
---|
10 | */ |
---|
11 | |
---|
12 | // |
---|
13 | // ANTLR C# Code Generator by Micheal Jordan |
---|
14 | // Kunle Odutola : kunle UNDERSCORE odutola AT hotmail DOT com |
---|
15 | // Anthony Oguntimehin |
---|
16 | // |
---|
17 | // With many thanks to Eric V. Smith from the ANTLR list. |
---|
18 | // |
---|
19 | |
---|
20 | /*An LL(k) parser. |
---|
21 | * |
---|
22 | * @see antlr.Token |
---|
23 | * @see antlr.TokenBuffer |
---|
24 | * @see antlr.LL1Parser |
---|
25 | */ |
---|
26 | public class LLkParser : Parser |
---|
27 | { |
---|
28 | internal int k; |
---|
29 | |
---|
30 | public LLkParser(int k_) |
---|
31 | { |
---|
32 | k = k_; |
---|
33 | } |
---|
34 | public LLkParser(ParserSharedInputState state, int k_) |
---|
35 | { |
---|
36 | k = k_; |
---|
37 | inputState = state; |
---|
38 | } |
---|
39 | public LLkParser(TokenBuffer tokenBuf, int k_) |
---|
40 | { |
---|
41 | k = k_; |
---|
42 | setTokenBuffer(tokenBuf); |
---|
43 | } |
---|
44 | public LLkParser(TokenStream lexer, int k_) |
---|
45 | { |
---|
46 | k = k_; |
---|
47 | TokenBuffer tokenBuf = new TokenBuffer(lexer); |
---|
48 | setTokenBuffer(tokenBuf); |
---|
49 | } |
---|
50 | /*Consume another token from the input stream. Can only write sequentially! |
---|
51 | * If you need 3 tokens ahead, you must consume() 3 times. |
---|
52 | * <p> |
---|
53 | * Note that it is possible to overwrite tokens that have not been matched. |
---|
54 | * For example, calling consume() 3 times when k=2, means that the first token |
---|
55 | * consumed will be overwritten with the 3rd. |
---|
56 | */ |
---|
57 | override public void consume() |
---|
58 | { |
---|
59 | inputState.input.consume(); |
---|
60 | } |
---|
61 | override public int LA(int i) |
---|
62 | { |
---|
63 | return inputState.input.LA(i); |
---|
64 | } |
---|
65 | override public IToken LT(int i) |
---|
66 | { |
---|
67 | return inputState.input.LT(i); |
---|
68 | } |
---|
69 | private void trace(string ee, string rname) |
---|
70 | { |
---|
71 | traceIndent(); |
---|
72 | Console.Out.Write(ee + rname + ((inputState.guessing > 0)?"; [guessing]":"; ")); |
---|
73 | for (int i = 1; i <= k; i++) |
---|
74 | { |
---|
75 | if (i != 1) |
---|
76 | { |
---|
77 | Console.Out.Write(", "); |
---|
78 | } |
---|
79 | if ( LT(i)!=null ) { |
---|
80 | Console.Out.Write("LA(" + i + ")==" + LT(i).getText()); |
---|
81 | } |
---|
82 | else |
---|
83 | { |
---|
84 | Console.Out.Write("LA(" + i + ")==ull"); |
---|
85 | } |
---|
86 | } |
---|
87 | Console.Out.WriteLine(""); |
---|
88 | } |
---|
89 | override public void traceIn(string rname) |
---|
90 | { |
---|
91 | traceDepth += 1; |
---|
92 | trace("> ", rname); |
---|
93 | } |
---|
94 | override public void traceOut(string rname) |
---|
95 | { |
---|
96 | trace("< ", rname); |
---|
97 | traceDepth -= 1; |
---|
98 | } |
---|
99 | } |
---|
100 | } |
---|