2013-06-04 1 views
0

(단순한) XPath 구문 분석기 용 JavaCC 스크립트를 작성하려고하는데 개별 단계를 구문 분석하는 데 문제가 있습니다. 나는 다음과 같은 스크립트 조각으로 변형 한JavaCC - XPATH 표현식의 단계를 구문 분석합니다.

Step ::= (AxisName "::")? NodeTest ("[" Predicate "]")* 

:

Step Step() : 
{ 
    Token t; 

    Step step; 

    Axis axis; 
    NodeTest nodeTest; 
    Expression predicate; 
} 
{ 
    { axis = Axis.child; } 

    (
     t = <IDENTIFIER> 
     { axis = Axis.valueOf(t.image); } 

     <COLON> 
     <COLON> 
    )? 

    t = <IDENTIFIER> 
    { nodeTest = new NodeNameTest(t.image); } 

    { step = new Step(axis, nodeTest); } 

    (  
     <OPEN_PAR> 

     predicate = Expression() 

     { step.addPredicate(predicate); } 

     <CLOSE_PAR> 
    )* 

    { return step; } 
} 

이,하지만 작동하지 않습니다

문법의 내 생각이있다.

p 

는 다음과 같은 오류가 발생합니다 :

Exception in thread "main" java.lang.IllegalArgumentException: No enum constant cz.dusanrychnovsky.generator.expression.Axis.p 
    at java.lang.Enum.valueOf(Unknown Source) 
    at cz.dusanrychnovsky.generator.expression.Axis.valueOf(Axis.java:3) 
    at cz.dusanrychnovsky.generator.parser.XPathParser.Step(XPathParser.java:123) 
    at cz.dusanrychnovsky.generator.parser.XPathParser.RelativeLocationPath(XPathParser.java:83) 
    at cz.dusanrychnovsky.generator.parser.XPathParser.AbsoluteLocationPath(XPathParser.java:66) 
    at cz.dusanrychnovsky.generator.parser.XPathParser.Start(XPathParser.java:23) 
    at cz.dusanrychnovsky.generator.parser.XPathParser.parse(XPathParser.java:16) 
    at cz.dusanrychnovsky.generator.Main.main(Main.java:24) 

내가 무슨 일하는 것은조차없는 콜론 불구 축 분기를 취하도록 파서 입력에 식별자를보고 있다는 것을 생각을 다음과 같은 표현을 감안할 때 파서가 그 당시에 알 수없는 것을 따를 것이다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 스텝 룰의 lookahead 값을 어떻게 든 증가시켜야합니까? 그렇다면 정확히 어떻게할까요? 또는 어떻게 든 규칙을 다시 작성해야합니까?

답변

1

두 가지 선택 :

( LOOKAHEAD(3) 
    t = <IDENTIFIER> 
    { axis = Axis.valueOf(t.image); } 

    <COLON> 
    <COLON> 
)? 

또는

( LOOKAHEAD(<IDENTIFIER> <COLON> <COLON>) 
    t = <IDENTIFIER> 
    { axis = Axis.valueOf(t.image); } 

    <COLON> 
    <COLON> 
)? 
관련 문제