2013-05-16 2 views
0

XPath 표현식의 (아주) 간단한 파서를 만들어야합니다. 그 목적으로 JavaCC를 사용하려고합니다. 저는 완전히 JavaCC를 처음 사용합니다 (학교에서 Flex & Bison을 배웠음에도 불구하고). 그래서 한 번에 작은 기능을 추가하여 단계별로 JJ 스크립트를 작성하려고합니다.JavaCC - XPath 파서

XPATHEXPRESSION ::= ("/" <STEP>)+ 
STEP ::= <AXIS_NAME> ":" <NODE_TEST> ("[" <EXPRESSION> "]")* 
EXPRESSION ::= <XPATHEXPRESSION> "=" """ <IDENTIFIER> """ 

을 그리고 관련 JJ 파일은 다음과 같습니다 :

지금까지 나는 다음과 같은 문법에 일어나서

options { 
    STATIC = false ; 
} 

PARSER_BEGIN(XPathParser) 

    package cz.me.generator.parser; 

    import cz.me.generator.expression.*; 

    import java.io.Reader; 
    import java.io.StringReader; 

    public class XPathParser 
    {   
     public static XPathExpr parse(String exprLiteral) 
      throws TokenMgrError, ParseException 
     { 
      Reader in = new StringReader(exprLiteral); 
      XPathParser parser = new XPathParser(in); 
      return parser.XPathExpr(); 
     } 
    } 

PARSER_END(XPathParser) 

SKIP : { " " } 

TOKEN : { < SLASH : "/" > } 
TOKEN : { < COLON : ":" > } 
TOKEN : { < OPEN_PAR : "[" > } 
TOKEN : { < CLOSE_PAR : "]" > } 
TOKEN : { < QUOTE : "\"" > } 

TOKEN : { < EQ : "=" > } 
TOKEN : { < GT : ">" > } 
TOKEN : { < LT : "<" > } 

TOKEN : { < IDENTIFIER : (["a"-"z","A"-"Z","0"-"9"])+ > } 
TOKEN : { < NUMBER : (["0"-"9"])+ > } 

Expression Expression() : 
{ 
    Token t; 

    XPathExpr xPathExpr; 
    String value; 
} 
{ 
    xPathExpr = XPathExpr() 

    <EQ> 

    <QUOTE> 
    t = <IDENTIFIER> 
    { value = t.image; } 
    <QUOTE> 

    { return new EqExpr(xPathExpr, new StringLiteral(value)); } 
} 

XPathExpr XPathExpr() : 
{ 
    XPathExpr xPathExpr; 
    Step step; 
} 
{ 
    { xPathExpr = new XPathExpr(); } 

    (
     <SLASH> 

     step = Step() 
     { xPathExpr.addStep(step); } 
    )+ 

    <EOF> 

    { return xPathExpr; } 
} 

Step Step() : 
{ 
    Token t; 

    Step step; 

    Axis axis; 
    NodeTest nodeTest; 
    Expression predicate; 
} 
{ 
    t = <IDENTIFIER> 
    { axis = Axis.valueOf(t.image); } 

    <COLON> 

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

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

    (  
     <OPEN_PAR> 

     predicate = Expression() 

     { step.addPredicate(predicate); } 

     <CLOSE_PAR> 
    )* 

    { return step; } 
} 

그러나이 작동하지 않습니다.

다음 코드 : (디버그 모드로 JavaCC에서 실행시)

XPathExpr expr = XPathParser.parse("/self:house/child:window[/child:material = \"glass\"]"); 
System.out.println(expr); 

다음과 같은 출력을 얻을 수 :

Call: XPathExpr 
    Consumed token: <"/" at line 1 column 1> 
    Call: Step 
    Consumed token: <<IDENTIFIER>: "self" at line 1 column 2> 
    Consumed token: <":" at line 1 column 6> 
    Consumed token: <<IDENTIFIER>: "house" at line 1 column 7> 
    Return: Step 
    Consumed token: <"/" at line 1 column 12> 
    Call: Step 
    Consumed token: <<IDENTIFIER>: "child" at line 1 column 13> 
    Consumed token: <":" at line 1 column 18> 
    Consumed token: <<IDENTIFIER>: "window" at line 1 column 19> 
    Consumed token: <"[" at line 1 column 25> 
    Call: Expression 
     Call: XPathExpr 
     Consumed token: <"/" at line 1 column 26> 
     Call: Step 
      Consumed token: <<IDENTIFIER>: "child" at line 1 column 27> 
      Consumed token: <":" at line 1 column 32> 
      Consumed token: <<IDENTIFIER>: "material" at line 1 column 33> 
     Return: Step 
     Return: XPathExpr 
    Return: Expression 
    Return: Step 
Return: XPathExpr 
Exception in thread "main" cz.me.generator.parser.ParseException: Encountered " "=" "= "" at line 1, column 42. 
Was expecting one of: 
    <EOF> 
    "/" ... 
    "[" ... 

    at cz.me.generator.parser.XPathParser.generateParseException(XPathParser.java:270) 
    at cz.me.generator.parser.XPathParser.jj_consume_token(XPathParser.java:207) 
    at cz.me.generator.parser.XPathParser.XPathExpr(XPathParser.java:65) 
    at cz.me.generator.parser.XPathParser.Expression(XPathParser.java:32) 
    at cz.me.generator.parser.XPathParser.Step(XPathParser.java:100) 
    at cz.me.generator.parser.XPathParser.XPathExpr(XPathParser.java:54) 
    at cz.me.generator.parser.XPathParser.parse(XPathParser.java:22) 
    at cz.me.generator.Main.main(Main.java:17) 

나는 JavaCC에이 문제가되지 않는 있는지 확인하기 위해 몇 가지 변화를 시도했다 재귀하지만 문제는 다른 곳에서 발생하는 것 같습니다.

무엇이 잘못 되었나요?

답변

1

문제는 XPathExpr에 <EOF>입니다. 꺼내. 제품 추가

void Start() : 
{ } 
{ 
    XPathExpr() 
    <EOF> 
} 

parse을 사용하여 시작을 사용하십시오.

+0

나는 본다. 튜토리얼에서 뼈대 스크립트로 시작한 다음 반복적으로 확장했습니다. 결국 나는 EOF 토큰을 전혀 잊었다. 당신의 도움을 주셔서 감사합니다. –