java - 在预煮中使用变量

标签 java parsing parser-generator parboiled

我正在尝试使用 parboiled Java library 创建一个简单的 XML 解析器.

以下代码尝试使用变量来验证结束标记是否包含与开始标记相同的标识符。

class SimpleXmlParser2 extends BaseParser<Object> {
    Rule Expression() {
        StringVar id = new StringVar();
        return Sequence(OpenElement(id), ElementContent(), CloseElement(id));
    }

    Rule OpenElement(StringVar id) {        
        return Sequence('<', Identifier(), ACTION(id.set(match())), '>');
    }

    Rule CloseElement(StringVar id) {    
        return Sequence("</", id.get(), '>');                               
    }

    Rule ElementContent() {
        return ZeroOrMore(NoneOf("<>"));
    }

    Rule Identifier() {
        return OneOrMore(CharRange('A', 'z'));
    }    
}

但是,当我创建 ParseRunner 时,上述内容失败,并显示错误消息 org.parboiled.errors.GrammarException: 'null' 无法自动转换为解析器规则

看来我对如何在半熟中使用变量有一个基本的误解。谁能帮我解决这个问题吗?

最佳答案

想出了一个答案。为任何其他可能遇到同样问题的新手提供帮助。

问题是对变量内容的任何访问都必须在解析器操作中进行,以确保它发生在解析阶段,而不是规则构建阶段。

对上述程序进行以下更改,确保在元素标识符不匹配时解析失败。

Rule CloseElement(StringVar id) {    
    return Sequence("</", Identifier(), matchStringVar(id), '>');                               
}

Action matchStringVar(final StringVar var) {
    return new Action() {
        public boolean run(Context ctx) {
            String match = ctx.getMatch();
            return match.equals(var.get());
        }
    };
}

关于java - 在预煮中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28638312/

相关文章:

java - Android 多 dex 项目设置

java - 如何忽略 "--"但不忽略 "-"

java - 解析 JsonObject 时出现问题 - 错误 'String cannot be converted to JSONObject'

java - 使用 JavaCC 解析树表示

java - 静态 Java 命令行解析器的生成器

java - 同步两个或多个对象 (Java)

java - 在迭代期间更改 HashMap 键

python - 如何解析 numpydoc 文档字符串并访问组件?

java - 使用Java解析Java/COBOL/VB等代码

parsing - 如何使用 ANTLR 4 跳过解析规则?