Javacc语法不能与可选标记一起使用。

问题描述 投票:0回答:1

我有一个用javaCC创建的DFM(是一个Delphi源文件,像JSON一样,用来定义表单组件布局)解析器。

我的语法(.jj文件)定义了这个。

private DfmObject dfmObject():
{
    DfmObject res = new DfmObject();
    DfmProperty prop;
    DfmObject obj;
    Token tName;
    Token tType;
}
{
    <OBJECT>
    (tName = <IDENTIFIER>  { res.setName(tName.image); } <COLON>)?
    tType = <IDENTIFIER>  { res.setType(tType.image); } 
    <ENDLINE> 
    ( prop = property()    { res.addProperty(prop); } )*
    ( obj = dfmObject()   { res.addChild(obj);     } (<ENDLINE>)*)*
    <END>
    { return res; }
}

这是为了解析2种类型的 object 的定义。

object name: Type 
end

如此

object Type
end

所以, name : 是可选的。

但是,当我试图解析第二个DFM时,我总是得到这个错误。

Exception in thread "main" eu.kaszkowiak.jdfm.parser.ParseException: Encountered " <ENDLINE> "\r\n"" at line 1, column 12.

Was expecting:

":" ...

我做错了什么?

javacc
1个回答
0
投票

一个解决的办法是,将可选的 : Type 部分,并可在 nametype 价值的时候。type == null.

参见语法实现。

private DfmObject dfmObject():
{
    DfmObject res = new DfmObject();
    DfmProperty prop;
    DfmObject obj;
    Token tName;
    Token tType;
}
{
    (
        <OBJECT>
        (
            tName = <IDENTIFIER>  { res.setName(tName.image); } 
        )
        ( <COLON> tType = <IDENTIFIER>  { res.setType(tType.image); } )?
        <ENDLINE>
    )
    ( prop = property()    { res.addProperty(prop); } )*
    ( obj = dfmObject()   { res.addChild(obj);     } (<ENDLINE>)*)*
    <END>
    {
        if (res.getType() == null) {
            res.setType(res.getName());
            res.setName(null);
        } 
        return res; 
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.