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에이 문제가되지 않는 있는지 확인하기 위해 몇 가지 변화를 시도했다 재귀하지만 문제는 다른 곳에서 발생하는 것 같습니다.
무엇이 잘못 되었나요?
나는 본다. 튜토리얼에서 뼈대 스크립트로 시작한 다음 반복적으로 확장했습니다. 결국 나는 EOF 토큰을 전혀 잊었다. 당신의 도움을 주셔서 감사합니다. –