致命错误:开始符号不会导出任何句子

时间:2017-01-09 07:53:56

标签: c yacc lex

Iam尝试使用lex和yacc开发计算器程序。我一直收到以下错误:

calc.y: warning: 5 nonterminals useless in grammar [-Wother]
calc.y: warning: 8 rules useless in grammar [-Wother]
calc.y:8.1: fatal error: start symbol I does not derive any sentence
 I : E '\n' {printf("%d\n",$1);}

我看了类似的问题,但他们有无限的递归,但这个没有。

calc.l

%{
#include"y.tab.h"
%}

digits [0-9]*

%%
{digits} {return DIGITS}
%%

int yywrap()
{
} 

calc.y

%{
    #include<stdio.h>   
%}

%token DIGITS

%%
I : E '\n' {printf("%d\n",$1);}
  ;
E : E '+' F {$$ = $1 + $3;}
  | E '-' F {$$ = $1 - $3;}
  ;
F : F '*' G {$$ = $1 * $3;}
  | F '/' G {$$ = $1 / $3;}
G :'('E')' 
  | DIGITS 
  ;
%%

int main()
{
    yyparse();
}
int yyerror()
{
}

1 个答案:

答案 0 :(得分:3)

我不知道yacc,但是:

  • 要构建I,您需要E

    I : E '\n'
    
  • 要构建E,您需要E

    E : E '+' F
      | E '-' F
    

由于如果您还没有E,就无法构建I(并且在开始时您没有任何内容),则无法构建E 1}}要么。

或者从另一方面看它:DIGITS是无限递归的,因为它总是引用自身。

如果我们从词法分析器开始,我们首先得到DIGITS

G可用于构建G

但我们无法对F '*' G执行任何操作,因为使用它的唯一规则(F '/' GF)也需要F才能继续,我们没有 ****************************************************************************** Starting task: NuGet Publisher ****************************************************************************** Set workingFolder to default: C:\BuildSystem\TfsAgent\tasks\NuGetPublisher\0.2.21 C:\Windows\system32\chcp.com 65001 Active code page: 65001 Detected NuGet version 3.3.0.212 / 3.3.0 SYSTEMVSSCONNECTION exists true C:\BuildSystem\TfsAgent\tasks\NuGetPublisher\0.2.21\node_modules\nuget-task-common\NuGet\3.3.0\NuGet.exe push -NonInteractive C:\BuildSystem\TfsAgent\_work\6\s\myfolderPackage\bin\Release\mypackage.1.16.1905.nupkg -Source HunextPackages -ApiKey VSTS Pushing mypackage 1.16.1905 to 'https://mytfsurl.com:444/tfs/DefaultCollection/_packaging/9ebd459f-9a02-456e-9243-c8d0f989c871/nuget/v2/'... Failed to process request. 'Conflict'. The remote server returned an error: (409) Conflict.. Error: C:\BuildSystem\TfsAgent\tasks\NuGetPublisher\0.2.21\node_modules\nuget-task-common\NuGet\3.3.0\NuGet.exe failed with return code: 1 Packages failed to publish ****************************************************************************** Finishing task: NuGetPublisher ****************************************************************************** System.Exception: Task NuGetPublisher failed. This caused the job to fail. Look at the logs for the task for more details. at Microsoft.TeamFoundation.DistributedTask.Worker.JobRunner.Run(IJobContext jobContext, IJobRequest job, IJobExtension jobExtension, CancellationTokenSource tokenSource) Worker Worker-bbe2b68d-3dfb-4b56-8546-bc2935a3ffe1 finished running job bbe2b68d-3dfb-4b56-8546-bc2935a3ffe1 ****************************************************************************** Finishing Build ****************************************************************************** 。所以我们陷入困境。