【问题标题】:How do I use templates with plain java blocks in JAPE grammars?如何在 JAPE 语法中使用带有纯 java 块的模板?
【发布时间】:2022-08-17 18:59:40
【问题描述】:

我一直在努力在我的 JAPE 语法中使用模板。我试图在右手边的 Java 块中使用它们,但我现在明白它们只能在普通的 JAPE 结构中工作。

作品:

Phase: FooPhase
Input: Token
Options: control=Appelt

Template: variable_name = \"testing\"

Rule: foo_1
(
    {Token.string == \"foo\"}
):annot
--> 
:annot.Foo = {var_name = [variable_name]}

不工作:

Phase: FooPhase
Input: Token
Options: control=Appelt

Template: variable_name = \"testing\"

Rule: foo_1
(
    {Token.string == \"foo\"}
):annot
--> 
: annot{
    FeatureMap newFeatures = Factory.newFeatureMap();
    newFeatures.put(\"var_name\", [variable_name]);
    outputAS.add(bindings.get(\"annot\").firstNode(),bindings.get(\"annot\").lastNode(),\"Foo\", newFeatures);
}
    

    标签: nlp gate


    【解决方案1】:

    一个对我有用的解决方案是使用包含模板作为特征的注释来标记左侧语法,然后在后续的 Java 块中提取该特征。

    例如:

    Phase: FooPhase
    Input: Token
    Options: control=Appelt
    
    Template: variable_name = "testing"
    
    Rule: foo_1
    (
        {Token.string == "foo"}
    ):annot
    --> 
    :annot.Foo = {var_name = [variable_name]},
    :annot{
    
        AnnotationSet thisAnnot = bindings.get("annot");
        AnnotationSet tmpFooAnn = inputAS.get("Foo", thisAnnot.firstNode().getOffset(), thisAnnot.lastNode().getOffset());
        String var_name_str     = (String) tmpAnn.iterator().next().getFeatures().get("var_name");
        inputAS.removeAll(tmpFooAnn);
    
        FeatureMap newFeatures = Factory.newFeatureMap();
        newFeatures.put("var_name", var_name_str);
    
        outputAS.add(bindings.get("annot").firstNode(),bindings.get("annot").lastNode(),"Foo", newFeatures);
    }
        
    

    为清晰起见简化代码,未经测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 2023-01-08
      • 1970-01-01
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多