我需要讓JavaCC知道上下文(當前父令牌),並根據該上下文期望發生不同的令牌。JavaCC:如何指定在特定上下文中預期使用哪個令牌?
考慮以下僞代碼:
TOKEN <abc> { "abc*" } // recognizes "abc", "abcd", "abcde", ...
TOKEN <abcd> { "abcd*" } // recognizes "abcd", "abcde", "abcdef", ...
TOKEN <element1> { "element1" "[" expectOnly(<abc>) "]" }
TOKEN <element2> { "element2" "[" expectOnly(<abcd>) "]" }
...
所以當生成的解析器是「內部」命名"element1"
,它遇到"abcdef"
識別出它作爲<abc>
,但是當它的「內部」令牌命名令牌"element2"
它識別與<abcd>
相同的字符串。
element1 [ abcdef ] // aha! it can only be <abc>
element2 [ abcdef ] // aha! it can only be <abcd>
如果我沒有錯,錯就表現的XML文件類似於更復雜的DTD定義。
那麼,如何指定哪個標記是有效/預期的「上下文」呢?
注意:這將是不足夠我真實的案例來定義一個種類的記號「等級制」,讓「ABCDEF」總是先對着<abcd>
比<abc>
匹配。我真的需要上下文感知令牌。
我發現,'JavaCC'允許指定詞法上下文。可悲的是,這使得一切都變得非常複雜,當你有許多令牌時,他們大多數需要自己的狀態。我已經開發了一個確定性狀態機解析器,並且目前正在增強它以接受非確定性狀態機。我必須承認,我的情況非常特別。 – 2010-05-05 18:14:59