首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变体无法在GF上编译

变体无法在GF上编译
EN

Stack Overflow用户
提问于 2020-12-14 22:57:20
回答 2查看 70关注 0票数 3

我构建了一个程序来从一个命令式树生成不同的谓词。

抽象文件:

代码语言:javascript
复制
abstract Test = {
      flags startcat = Utterance;
      cat
          Utterance; Imperative; Verb; VerbPhrase;
      fun

      -- verb phrase
      Play_VP : VerbPhrase;


      -- Imp
      Play_Imp : VerbPhrase -> Imperative;


      -- Utt
      Sentence : Imperative -> Utterance;}

具体文件:

代码语言:javascript
复制
concrete TestEng of Test = open SyntaxEng, TestEngSrc, ParadigmsEng in {

lincat
    Utterance   = Utt;
    Imperative  = Imp;
    VerbPhrase  = VP;
    Verb        = V;
lin


-- verb phrase
Play_VP = mkVP ( variants{ mkV(play_Str) ; put_on_V });


--Imp
Play_Imp verbPhrase = mkImp(verbPhrase);

--Utt
Sentence imperative = mkUtt(imperative);}

最后是源文件:

代码语言:javascript
复制
resource TestEngSrc = open ParadigmsEng, SyntaxEng in {

oper
    -- verb string
    play_Str : Str  = variants{ "broadcast" ; "play"
                    ; "replay" ; "see" ; "view" ; "watch" ; "show"};

    -- verb
    play_V : V = variants {mkV(play_Str) ; put_on_V };


        -- verb part
        put_on_V : V = partV (mkV "put") "on";}

但只要我运行这个程序,它就会开始运行,并坚持到这种情况

我在GitHub上搜索了GF线程,以确定这个问题是个人问题还是一般问题,但我找到了这个页面:https://github.com/GrammaticalFramework/GF/issues/32,其中提到了在更新版本的GF中将提供一个解决方案。是否有关于此线程的更新,或者是否有比此线程中提供的解决方案更好的解决方案。感谢您的时间和努力。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-15 03:02:40

没有,在变种的处理上还没有更新。但幸运的是,您的代码可以通过一个小的修复来提高效率。

VP又大又慢

语法中最大的瓶颈是你有一个类别VerbPhrase,其中有来自RGL的lincat VP。它对最终用户是不可见的,但一个VP包含近3000个字段。如果你想看看,在GF shell中试试这个:

代码语言:javascript
复制
> i -retain TestEngSrc.gf
> cc mkVP play_V
... lots of output

我不知道编译的确切细节,但是如果VP有8个变体,编译器就会卡住。

如何修正你的语法

如果您知道将只在命令式中使用动词,那么您可以完全跳过VP阶段,直接从动词创建命令式。V的RGL类别要好得多,它有6个字段,而不是大约3000个字段。因此,如果你改变语法,它会立即编译。我将名称更改为Test2,这样您就可以与旧的进行比较。

代码语言:javascript
复制
abstract Test2 = {
      flags startcat = Utterance;
      cat
          Utterance; Imperative; Verb;
      fun

      -- Verb
      Play_V : Verb ;

      -- Imp
      Play_Imp : Verb -> Imperative;

      -- Utt
      Sentence : Imperative -> Utterance;
}

具体的语法在这里。我打开了IrregEngLexiconEng,因为其中一些动词已经定义好了。

代码语言:javascript
复制
concrete Test2Eng of Test2 = open SyntaxEng, ParadigmsEng, IrregEng, LexiconEng in {

lincat
    Utterance   = Utt;
    Imperative  = Imp;
    Verb        = V;
lin

  --Verb
  -- broadcast_V, see_V, show_V are in IrregEng.  play_V is in LexiconEng.
  Play_V = play_V|replay_V|broadcast_V|see_V|show_V|view_V|watch_V|put_on_V ;


  --Imp
  Play_Imp verb = mkImp verb ;

  --Utt
  Sentence imperative = mkUtt imperative ;

  oper
    replay_V : V = mkV "replay" ;
    view_V : V = mkV "view" ;
    watch_V : V = mkV "watch" ;
    put_on_V : V = partV put_V "on"; -- put_V is in IrregEng
}

在GF shell中进行测试,按照预期工作:

代码语言:javascript
复制
Test2> p "replay"
Sentence (Play_Imp Play_V)

Test2> p "watch"
Sentence (Play_Imp Play_V)

Test2> gt | l -treebank -all
Test2: Sentence (Play_Imp Play_V)
Test2Eng: play
Test2Eng: replay
Test2Eng: broadcast
Test2Eng: see
Test2Eng: show
Test2Eng: view
Test2Eng: watch
Test2Eng: put on
票数 2
EN

Stack Overflow用户

发布于 2020-12-16 09:07:13

因为我需要使用动词短语,所以没有办法跳过它。因此,我试图找出这个问题背后的原因,并得出以下结果:

在这种情况下,虽然变体的数量不超过三个字符串,但它仍然会在每次程序运行时冻结。

有错误的代码

摘要:

代码语言:javascript
复制
   abstract Test = {
   flags startcat = VerbPhrase;
   cat
       VerbPhrase; Verb; 
   fun

   Play_VP : VerbPhrase;
}

具体情况:

代码语言:javascript
复制
   concrete TestEng of Test = open SyntaxEng,  ParadigmsEng, IrregEng in {
   
   lincat
       VerbPhrase  = VP;
       Verb        = V ;
   lin

       Play_VP = mkVP(play_V);


   oper

   play_V : V = variants {mkV(play_Str) ; put_on_V};

   play_Str : Str = variants {"play" ; "brodcast"};

   put_on_V : V = partV put_V "on";
}

但在另一种情况下,当动词在这种方法中被抽象定义时,程序运行得很好。

没有错误的代码

摘要:

代码语言:javascript
复制
   abstract Test = {
   flags startcat = VerbPhrase;
   cat
       VerbPhrase; Verb; 
   fun

   Play_V : Verb;

   Play_VP : Verb -> VerbPhrase;
}

具体情况:

代码语言:javascript
复制
concrete TestEng of Test = open SyntaxEng,  ParadigmsEng, IrregEng in {
   
   lincat
       VerbPhrase  = VP;
       Verb        = V ;
   lin

       Play_V = variants {mkV(play_Str) ; put_on_V};

       Play_VP play_v = mkVP(play_v);


   oper

   play_Str : Str = variants {"play" ; "brodcast"};

   put_on_V : V = partV put_V "on";
}

显然,问题实际上并不在VP结构中,而是在调用带有变体的操作时VP的行为方式。

希望你们能仔细研究一下这个问题,找到一个解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65291197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档