【问题标题】:How to implement the grammar for this exercise in lex & yacc如何在 lex & yacc 中实现本练习的语法
【发布时间】:2021-02-21 05:56:39
【问题描述】:

Exercise

我正在尝试使用 lex & yacc 来实现本练习的语法,但它会引发此冲突:警告:5 次移位/减少冲突 [-Wconflicts-sr]时间> 并将每个字符串都视为无效,我认为它必须具有优先级: 它应该接受如下字符串: ba#ababadada#bad#dabbada 并拒绝: 爸爸#ad#abaadad#badadbaad 这是我尝试过的:

%{
#include <stdio.h>
int flag=0;
%}
%{
void yyerror();
%}

%token A B D NL
%%
str1        :   Oracion NL      { printf("\n Sequence accepted");return(0);}
        ;
Oracion     :   Oracion '#' Parrafo     { }
        |   Parrafo         { }
        ;
Parrafo     :   Silaba Parrafo Silaba           { }
        |   Silaba              { }
        ;
Silaba      :   Explosion Alto      { }
        |   A Explosion             { }
        |   A Alto          { }
        |   Explosion           { }
        ;
Explosion   :   Alto A              { }
        ;
Alto        :   B               { }
        |   D               { }
        ;   
%%
void main()
{
    printf("\n write a sequence\n");
    yyparse();
    if(flag == 0)
        printf("\n Valid sequence");
}
void yyerror()
{
    printf("\n Invalid Sequence\n\n");
    flag=1;
}

【问题讨论】:

  • 注意:return (0) 在操作str1: Oracion NL { printf("\n Sequence accepted");return(0);} 中不正确。你的导师有没有告诉你这样做?或者你是从某个在线教程中得到的(这可能表明教程不是很好)。
  • 请不要删除已回答的问题。它对那些免费贡献时间回答的人表现出极大的不尊重。
  • 昨天有人对return 0 和一个名为flag 的变量有着同样好奇的用法,删除了一个我正在回答的问题。也许他们是你的同学,我不知道。但这超级烦人。不管怎样,我真的很想知道这个成语是从哪里来的。

标签: grammar yacc lex


【解决方案1】:

该语法允许四个音节(忽略b 和d 之间的非句法区别):

ba
bab
ab
aba

单词是包含奇数个音节的序列。由于没有以任何方式标记音节边界,因此对音节的划分是模棱两可的,这就是野牛报告冲突的原因。例如,babab 可以被解析为

ba-bab  (Explosión / Explosión Alto)
bab-ab  (Explosión Alto / "a" Alto)

在少数情况下,单词必须由奇数个音节组成这一事实可以消除解析的歧义。比如bababa只能分解为ba-ba-ba(Explosión / Explosión / Explosión),因为bab-aba(Explosión Alto / "a" Explosión)只有两个音节,一个偶数。特别是,这意味着贪婪的解决方案——总是使用尽可能长的音节——有时会产生错误的解析。此外,如果没有任意前瞻,就无法保证正确的解析,这使得 LR 解析器不合适。考虑以下两个词:

abababbabbabbabbabbabbab
abababbabbabbabbabbabbabbab

双辅音是一个明确的音节分隔符,因此唯一的歧义分隔符是前六个字符,如上所示,可能是两个或三个音节。查看整个单词,很明显这些选择中的哪一个导致了具有奇数个音节的单词。但是在看到整个单词之前,解析器无法知道。特别是,在它看到最初的ab 之后,它必须决定是将其解析为a Alto 形式的音节还是将其后的a 转换为a Explosión。但任何固定的前瞻性限制都不足以在所有情况下做出此决定。

我认为该练习旨在帮助您理解这种歧义(除非该练习比您在问题中显示的内容更多)。我不确定你还被要求做什么。如果您想使用 bison 来实际生成解析树,则必须以某种方式处理歧义,这可能意味着使用 GLR parser。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多