2017-04-30 10 views
-1

코드 :너무 많은 쓸모없는 규칙은 터미널에 표시

%{ 
#include <stdio.h> 
#include <string.h> 
#include <malloc.h> 
#include "gener.h" 
#include "sym_tab.h" 
#include "scope.h" 
#include "defs.h" 
extern char *yytext; 
#define YYPRINT(file, type, value) yyprint (file, type, value) 
%} 

%union 
{ 
char *name; 
char idtype; 
decl_list idlist; 
/*decl_list is in gener.h, 
    you should #include "gener.h" 
*/ 
} 

%token PROGRAM 
%token IDENTIFIER 
%token DECIMAL_CONSTANT 
%token DECLARE ENDDECLARE 

%token AND CALL DEFAULT 
%token FUNCTION PROCEDURE IN INOUT 
%token IF ELSE DO WHILE FOR OR NOT SELECT 
%token RETURN EXIT PRINT 
%token EQ_LT EQ_GT NE EXACT 
%left '+' '-' 
%right '*' '/' 



%start program 
%% 

program 
     : %empty 
     | PROGRAM IDENTIFIER block 
     ; 

block 
     : "{" declarations subprograms sequence "}" 
     ; 
declarations 
     : %empty 
     | DECLARE varlist ENDDECLARE 
     ; 
varlist 
     : %empty 
     | assignment_stat identifier2 
     ; 

identifier2 : ',' assignment_stat 
     | ',' assignment_stat 

     ; 
subprograms 
     : func 
     | subprograms ',' 
     ; 
func   
     : PROCEDURE IDENTIFIER funcbody 
     | FUNCTION IDENTIFIER funcbody 
     ; 
funcbody  
     : formalpars block 
     ; 
formalpars 
     : '('')' 
     | '(' formalparlist ')' 

     ; 
formalparlist 
     : formalparitem 
     | formalparlist ',' 

     ; 
formalparitem 
     : IN IDENTIFIER 
     | INOUT IDENTIFIER 
     ;  
sequence 
     : statement statement_sequence 
     ; 
statement_sequence 
     : ";"statement 
     | ';' statement statement_sequence 
     ; 
brackets_seq  
     : '{' sequence '}' 
     ; 
brack_or_stat 
     : brackets_seq 
     | statement 
     ; 


statement 
     : %empty 
     | assignment_stat 
     | if_stat 
     | do_while_stat 
     | while_stat 
     | select_stat 
     | exit_stat 
     | return_stat 
     | print_stat 
     | call_stat 
     ; 
assignment_stat 
      : IDENTIFIER EXACT IDENTIFIER 
      ; 

if_stat 
     : IF '(' condition')' brack_or_stat elsepart 
     ; 
elsepart 
     : %empty 
     | ELSE brack_or_stat 
     ; 
while_stat 
     : WHILE '(' condition')' brack_or_stat 
     ; 
select_stat 
     : SELECT'(' IDENTIFIER')' 
      dec 
      DEFAULT":" brack_or_stat 
     ; 
dec 
     : DECIMAL_CONSTANT ':' brack_or_stat 
     | dec ',' 
     ; 
do_while_stat 
     : DO brack_or_stat WHILE '(' condition ')' 
     ; 
exit_stat 
     : EXIT 
     ; 
return_stat 
     : RETURN '(' expression ')' 
     ; 
print_stat 
     : PRINT '('expression ')' 
     ; 
call_stat 
     : CALL IDENTIFIER actualpars 
     ; 
actualpars 
     : '('')' 
     | '('actualparlist')' 
     ; 
actualparlist 
     : actualparitem 
     | actualparlist ',' 
     ; 
actualparitem 
     : IN expression 
     | INOUT IDENTIFIER 
     ; 
condition 
     : boolterm or_boolterm 
     ; 
or_boolterm 
     : OR boolterm 
     | OR boolterm or_boolterm 
     ; 
boolterm  
     : boolfactor and_boolfactor 
     ; 
and_boolfactor 
     : AND boolfactor 
     | AND boolfactor and_boolfactor 
     ; 
boolfactor 
     : NOT '[' condition ']' 
     | '[' condition ']' 
     | expression relational_oper expression 
     ; 
expression 
     : optional_sign term add_oper_term 
     ; 
add_oper_term 
     : add_oper term 
     | add_oper term add_oper_term 
     ; 
term   
     : factor mul_oper_factor 
     ; 
mul_oper_factor 
     : mul_oper factor 
     | mul_oper factor mul_oper_factor 
     ; 
factor 
     : DECIMAL_CONSTANT 
     | expression 
     | IDENTIFIER idtail 
     ; 
idtail 
     : %empty 
     | actualpars 
     ; 
relational_oper 
     : '=' 
     | '<' 
     | "<=" 
     | "<>" 
     | ">=" 
     | '>' 
     ; 
add_oper 
     : '+' 
     | '-' 
     ; 
mul_oper 
     : '*' 
     | '/' 
     ; 
optional_sign 
     : add_oper 
     | %empty 
     ; 



%% 

이 내가 들소 생성 문법이지만, 내가 터미널에 경고의 무리를 들소 gram.y을 시도 할 때 표시 . 그들은이 기록되는 순서를 전환하려하지만 여전히 내가 같은 일을 얻을 여기

gram.y: warning: 44 nonterminals useless in grammar [-Wother] 
gram.y: warning: 86 rules useless in grammar [-Wother] 
gram.y:43.38-42: warning: nonterminal useless in grammar: block [-Wother] 
     | PROGRAM IDENTIFIER block 
             ^^^^^ 
gram.y:47.23-34: warning: nonterminal useless in grammar: declarations [-Wother] 
     : "{" declarations subprograms sequence "}" 
         ^^^^^^^^^^^^ 
gram.y:51.27-33: warning: nonterminal useless in grammar: varlist [-Wother] 
     | DECLARE varlist ENDDECLARE 
          ^^^^^^^ 
gram.y:55.35-45: warning: nonterminal useless in grammar: identifier2 [-Wother] 
     | assignment_stat identifier2 
            ^^^^^^^^^^^ 
gram.y:47.36-46: warning: nonterminal useless in grammar: subprograms [-Wother] 
     : "{" declarations subprograms sequence "}" 
            ^^^^^^^^^^^ 
gram.y:63.19-22: warning: nonterminal useless in grammar: func [-Wother] 
     : func 
        ^^^^ 
gram.y:67.40-47: warning: nonterminal useless in grammar: funcbody [-Wother] 
     : PROCEDURE IDENTIFIER funcbody 
             ^^^^^^^^ 
gram.y:71.19-28: warning: nonterminal useless in grammar: formalpars [-Wother] 
     : formalpars block 
        ^^^^^^^^^^ 
gram.y:75.23-35: warning: nonterminal useless in grammar: formalparlist [-Wother] 
     | '(' formalparlist ')' 
         ^^^^^^^^^^^^^ 
gram.y:79.19-31: warning: nonterminal useless in grammar: formalparitem [-Wother] 
     : formalparitem 
        ^^^^^^^^^^^^^ 
gram.y:47.48-55: warning: nonterminal useless in grammar: sequence [-Wother] 
     : "{" declarations subprograms sequence "}" 
               ^^^^^^^^ 
gram.y:88.29-46: warning: nonterminal useless in grammar: statement_sequence [-Wother] 
     : statement statement_sequence 
          ^^^^^^^^^^^^^^^^^^ 
gram.y:94.1-12: warning: nonterminal useless in grammar: brackets_seq [-Wother] 
brackets_seq 
^^^^^^^^^^^^ 
gram.y:97.1-13: warning: nonterminal useless in grammar: brack_or_stat [-Wother] 
brack_or_stat 
^^^^^^^^^^^^^ 
gram.y:88.19-27: warning: nonterminal useless in grammar: statement [-Wother] 
     : statement statement_sequence 
        ^^^^^^^^^ 
gram.y:55.19-33: warning: nonterminal useless in grammar: assignment_stat [-Wother] 
     | assignment_stat identifier2 
        ^^^^^^^^^^^^^^^ 
gram.y:106.19-25: warning: nonterminal useless in grammar: if_stat [-Wother] 
     | if_stat 
        ^^^^^^^ 
gram.y:120.53-60: warning: nonterminal useless in grammar: elsepart [-Wother] 
     : IF '(' condition')' brack_or_stat elsepart 
                ^^^^^^^^ 
gram.y:108.19-28: warning: nonterminal useless in grammar: while_stat [-Wother] 
     | while_stat 
        ^^^^^^^^^^ 
gram.y:109.19-29: warning: nonterminal useless in grammar: select_stat [-Wother] 
     | select_stat 
        ^^^^^^^^^^^ 
gram.y:131.19-21: warning: nonterminal useless in grammar: dec [-Wother] 
      dec 
        ^^^ 
gram.y:107.19-31: warning: nonterminal useless in grammar: do_while_stat [-Wother] 
     | do_while_stat 
        ^^^^^^^^^^^^^ 
gram.y:110.19-27: warning: nonterminal useless in grammar: exit_stat [-Wother] 
     | exit_stat 
        ^^^^^^^^^ 
gram.y:111.19-29: warning: nonterminal useless in grammar: return_stat [-Wother] 
     | return_stat 
        ^^^^^^^^^^^ 
gram.y:112.19-28: warning: nonterminal useless in grammar: print_stat [-Wother] 
     | print_stat 
        ^^^^^^^^^^ 
gram.y:113.19-27: warning: nonterminal useless in grammar: call_stat [-Wother] 
     | call_stat 
        ^^^^^^^^^ 
gram.y:151.35-44: warning: nonterminal useless in grammar: actualpars [-Wother] 
     : CALL IDENTIFIER actualpars 
            ^^^^^^^^^^ 
gram.y:155.22-34: warning: nonterminal useless in grammar: actualparlist [-Wother] 
     | '('actualparlist')' 
         ^^^^^^^^^^^^^ 
gram.y:158.19-31: warning: nonterminal useless in grammar: actualparitem [-Wother] 
     : actualparitem 
        ^^^^^^^^^^^^^ 
gram.y:120.26-34: warning: nonterminal useless in grammar: condition [-Wother] 
     : IF '(' condition')' brack_or_stat elsepart 
          ^^^^^^^^^ 
gram.y:166.28-38: warning: nonterminal useless in grammar: or_boolterm [-Wother] 
     : boolterm or_boolterm 
          ^^^^^^^^^^^ 
gram.y:166.19-26: warning: nonterminal useless in grammar: boolterm [-Wother] 
     : boolterm or_boolterm 
        ^^^^^^^^ 
gram.y:173.30-43: warning: nonterminal useless in grammar: and_boolfactor [-Wother] 
     : boolfactor and_boolfactor 
           ^^^^^^^^^^^^^^ 
gram.y:173.19-28: warning: nonterminal useless in grammar: boolfactor [-Wother] 
     : boolfactor and_boolfactor 
        ^^^^^^^^^^ 
gram.y:145.30-39: warning: nonterminal useless in grammar: expression [-Wother] 
     : RETURN '(' expression ')' 
           ^^^^^^^^^^ 
gram.y:185.38-50: warning: nonterminal useless in grammar: add_oper_term [-Wother] 
     : optional_sign term add_oper_term 
             ^^^^^^^^^^^^^ 
gram.y:185.33-36: warning: nonterminal useless in grammar: term [-Wother] 
     : optional_sign term add_oper_term 
           ^^^^ 
gram.y:192.26-40: warning: nonterminal useless in grammar: mul_oper_factor [-Wother] 
     : factor mul_oper_factor 
          ^^^^^^^^^^^^^^^ 
gram.y:192.19-24: warning: nonterminal useless in grammar: factor [-Wother] 
     : factor mul_oper_factor 
        ^^^^^^ 
gram.y:201.30-35: warning: nonterminal useless in grammar: idtail [-Wother] 
     | IDENTIFIER idtail 
           ^^^^^^ 
gram.y:182.30-44: warning: nonterminal useless in grammar: relational_oper [-Wother] 
     | expression relational_oper expression 
           ^^^^^^^^^^^^^^^ 
gram.y:188.19-26: warning: nonterminal useless in grammar: add_oper [-Wother] 
     : add_oper term 
        ^^^^^^^^ 
gram.y:195.19-26: warning: nonterminal useless in grammar: mul_oper [-Wother] 
     : mul_oper factor mul_oper_factor 
        ^^^^^^^^ 
gram.y:185.19-31: warning: nonterminal useless in grammar: optional_sign [-Wother] 
     : optional_sign term add_oper_term 
        ^^^^^^^^^^^^^ 
gram.y:43.19-42: warning: rule useless in grammar [-Wother] 
     | PROGRAM IDENTIFIER block 
        ^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:47.19-59: warning: rule useless in grammar [-Wother] 
     : "{" declarations subprograms sequence "}" 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:50.19-24: warning: rule useless in grammar [-Wother] 
     : %empty 
        ^^^^^^ 
gram.y:51.19-44: warning: rule useless in grammar [-Wother] 
     | DECLARE varlist ENDDECLARE 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:54.19-24: warning: rule useless in grammar [-Wother] 
     : %empty 
        ^^^^^^ 
gram.y:55.19-45: warning: rule useless in grammar [-Wother] 
     | assignment_stat identifier2 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:58.19-37: warning: rule useless in grammar [-Wother] 
identifier2 : ',' assignment_stat 
        ^^^^^^^^^^^^^^^^^^^ 
gram.y:59.19-37: warning: rule useless in grammar [-Wother] 
     | ',' assignment_stat 
        ^^^^^^^^^^^^^^^^^^^ 
gram.y:63.19-22: warning: rule useless in grammar [-Wother] 
     : func 
        ^^^^ 
gram.y:64.19-33: warning: rule useless in grammar [-Wother] 
     | subprograms ',' 
        ^^^^^^^^^^^^^^^ 
gram.y:67.19-47: warning: rule useless in grammar [-Wother] 
     : PROCEDURE IDENTIFIER funcbody 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:68.19-46: warning: rule useless in grammar [-Wother] 
     | FUNCTION IDENTIFIER funcbody 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:71.19-34: warning: rule useless in grammar [-Wother] 
     : formalpars block 
        ^^^^^^^^^^^^^^^^ 
gram.y:74.19-24: warning: rule useless in grammar [-Wother] 
     : '('')' 
        ^^^^^^ 
gram.y:75.19-39: warning: rule useless in grammar [-Wother] 
     | '(' formalparlist ')' 
        ^^^^^^^^^^^^^^^^^^^^^ 
gram.y:79.19-31: warning: rule useless in grammar [-Wother] 
     : formalparitem 
        ^^^^^^^^^^^^^ 
gram.y:80.19-35: warning: rule useless in grammar [-Wother] 
     | formalparlist ',' 
        ^^^^^^^^^^^^^^^^^ 
gram.y:84.19-31: warning: rule useless in grammar [-Wother] 
     : IN IDENTIFIER 
        ^^^^^^^^^^^^^ 
gram.y:85.19-34: warning: rule useless in grammar [-Wother] 
     | INOUT IDENTIFIER 
        ^^^^^^^^^^^^^^^^ 
gram.y:88.19-46: warning: rule useless in grammar [-Wother] 
     : statement statement_sequence 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:91.19-30: warning: rule useless in grammar [-Wother] 
     : ";"statement 
        ^^^^^^^^^^^^ 
gram.y:92.19-50: warning: rule useless in grammar [-Wother] 
     | ';' statement statement_sequence 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:95.19-34: warning: rule useless in grammar [-Wother] 
     : '{' sequence '}' 
        ^^^^^^^^^^^^^^^^ 
gram.y:98.19-30: warning: rule useless in grammar [-Wother] 
     : brackets_seq 
        ^^^^^^^^^^^^ 
gram.y:99.19-27: warning: rule useless in grammar [-Wother] 
     | statement 
        ^^^^^^^^^ 
gram.y:104.19-24: warning: rule useless in grammar [-Wother] 
     : %empty 
        ^^^^^^ 
gram.y:105.19-33: warning: rule useless in grammar [-Wother] 
     | assignment_stat 
        ^^^^^^^^^^^^^^^ 
gram.y:106.19-25: warning: rule useless in grammar [-Wother] 
     | if_stat 
        ^^^^^^^ 
gram.y:107.19-31: warning: rule useless in grammar [-Wother] 
     | do_while_stat 
        ^^^^^^^^^^^^^ 
gram.y:108.19-28: warning: rule useless in grammar [-Wother] 
     | while_stat 
        ^^^^^^^^^^ 
gram.y:109.19-29: warning: rule useless in grammar [-Wother] 
     | select_stat 
        ^^^^^^^^^^^ 
gram.y:110.19-27: warning: rule useless in grammar [-Wother] 
     | exit_stat 
        ^^^^^^^^^ 
gram.y:111.19-29: warning: rule useless in grammar [-Wother] 
     | return_stat 
        ^^^^^^^^^^^ 
gram.y:112.19-28: warning: rule useless in grammar [-Wother] 
     | print_stat 
        ^^^^^^^^^^ 
gram.y:113.19-27: warning: rule useless in grammar [-Wother] 
     | call_stat 
        ^^^^^^^^^ 
gram.y:116.19-45: warning: rule useless in grammar [-Wother] 
      : IDENTIFIER EXACT IDENTIFIER 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:120.19-60: warning: rule useless in grammar [-Wother] 
     : IF '(' condition')' brack_or_stat elsepart 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:123.19-24: warning: rule useless in grammar [-Wother] 
     : %empty 
        ^^^^^^ 
gram.y:124.19-36: warning: rule useless in grammar [-Wother] 
     | ELSE brack_or_stat 
        ^^^^^^^^^^^^^^^^^^ 
gram.y:127.19-54: warning: rule useless in grammar [-Wother] 
     : WHILE '(' condition')' brack_or_stat 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:130.19-132.42: warning: rule useless in grammar [-Wother] 
     : SELECT'(' IDENTIFIER')' 
        ^^^^^^^^^ 
gram.y:135.19-52: warning: rule useless in grammar [-Wother] 
     : DECIMAL_CONSTANT ':' brack_or_stat 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:136.19-25: warning: rule useless in grammar [-Wother] 
     | dec ',' 
        ^^^^^^^ 
gram.y:139.19-58: warning: rule useless in grammar [-Wother] 
     : DO brack_or_stat WHILE '(' condition ')' 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:142.19-22: warning: rule useless in grammar [-Wother] 
     : EXIT 
        ^^^^ 
gram.y:145.19-43: warning: rule useless in grammar [-Wother] 
     : RETURN '(' expression ')' 
        ^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:148.19-41: warning: rule useless in grammar [-Wother] 
     : PRINT '('expression ')' 
        ^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:151.19-44: warning: rule useless in grammar [-Wother] 
     : CALL IDENTIFIER actualpars 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:154.19-24: warning: rule useless in grammar [-Wother] 
     : '('')' 
        ^^^^^^ 
gram.y:155.19-37: warning: rule useless in grammar [-Wother] 
     | '('actualparlist')' 
        ^^^^^^^^^^^^^^^^^^^ 
gram.y:158.19-31: warning: rule useless in grammar [-Wother] 
     : actualparitem 
        ^^^^^^^^^^^^^ 
gram.y:159.19-35: warning: rule useless in grammar [-Wother] 
     | actualparlist ',' 
        ^^^^^^^^^^^^^^^^^ 
gram.y:162.19-31: warning: rule useless in grammar [-Wother] 
     : IN expression 
        ^^^^^^^^^^^^^ 
gram.y:163.19-34: warning: rule useless in grammar [-Wother] 
     | INOUT IDENTIFIER 
        ^^^^^^^^^^^^^^^^ 
gram.y:166.19-38: warning: rule useless in grammar [-Wother] 
     : boolterm or_boolterm 
        ^^^^^^^^^^^^^^^^^^^^ 
gram.y:169.19-29: warning: rule useless in grammar [-Wother] 
     : OR boolterm 
        ^^^^^^^^^^^ 
gram.y:170.19-41: warning: rule useless in grammar [-Wother] 
     | OR boolterm or_boolterm 
        ^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:173.19-43: warning: rule useless in grammar [-Wother] 
     : boolfactor and_boolfactor 
        ^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:176.19-32: warning: rule useless in grammar [-Wother] 
     : AND boolfactor 
        ^^^^^^^^^^^^^^ 
gram.y:177.19-47: warning: rule useless in grammar [-Wother] 
     | AND boolfactor and_boolfactor 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:180.19-39: warning: rule useless in grammar [-Wother] 
     : NOT '[' condition ']' 
        ^^^^^^^^^^^^^^^^^^^^^ 
gram.y:181.19-35: warning: rule useless in grammar [-Wother] 
     | '[' condition ']' 
        ^^^^^^^^^^^^^^^^^ 
gram.y:182.19-55: warning: rule useless in grammar [-Wother] 
     | expression relational_oper expression 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:185.19-50: warning: rule useless in grammar [-Wother] 
     : optional_sign term add_oper_term 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:188.19-31: warning: rule useless in grammar [-Wother] 
     : add_oper term 
        ^^^^^^^^^^^^^ 
gram.y:189.19-45: warning: rule useless in grammar [-Wother] 
     | add_oper term add_oper_term 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:192.19-40: warning: rule useless in grammar [-Wother] 
     : factor mul_oper_factor 
        ^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:195.19-49: warning: rule useless in grammar [-Wother] 
     : mul_oper factor mul_oper_factor 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
gram.y:196.19-33: warning: rule useless in grammar [-Wother] 
     | mul_oper factor 
        ^^^^^^^^^^^^^^^ 
gram.y:199.19-34: warning: rule useless in grammar [-Wother] 
     : DECIMAL_CONSTANT 
        ^^^^^^^^^^^^^^^^ 
gram.y:200.19-28: warning: rule useless in grammar [-Wother] 
     | expression 
        ^^^^^^^^^^ 
gram.y:201.19-35: warning: rule useless in grammar [-Wother] 
     | IDENTIFIER idtail 
        ^^^^^^^^^^^^^^^^^ 
gram.y:204.19-24: warning: rule useless in grammar [-Wother] 
     : %empty 
        ^^^^^^ 
gram.y:205.19-28: warning: rule useless in grammar [-Wother] 
     | actualpars 
        ^^^^^^^^^^ 
gram.y:208.19-21: warning: rule useless in grammar [-Wother] 
     : '=' 
        ^^^ 
gram.y:209.19-21: warning: rule useless in grammar [-Wother] 
     | '<' 
        ^^^ 
gram.y:210.19-22: warning: rule useless in grammar [-Wother] 
     | "<=" 
        ^^^^ 
gram.y:211.19-22: warning: rule useless in grammar [-Wother] 
     | "<>" 
        ^^^^ 
gram.y:212.19-22: warning: rule useless in grammar [-Wother] 
     | ">=" 
        ^^^^ 
gram.y:213.19-21: warning: rule useless in grammar [-Wother] 
     | '>' 
        ^^^ 
gram.y:216.19-21: warning: rule useless in grammar [-Wother] 
     : '+' 
        ^^^ 
gram.y:217.19-21: warning: rule useless in grammar [-Wother] 
     | '-' 
        ^^^ 
gram.y:220.19-21: warning: rule useless in grammar [-Wother] 
     : '*' 
        ^^^ 
gram.y:221.19-21: warning: rule useless in grammar [-Wother] 
     | '/' 
        ^^^ 
gram.y:224.19-26: warning: rule useless in grammar [-Wother] 
     : add_oper 
        ^^^^^^^^ 
gram.y:225.19-24: warning: rule useless in grammar [-Wother] 
     | %empty 
        ^^^^^^ 

저를 도와주세요 any1 수있는 단자 출력은?

답변

2

문제는 subprograms에 대한 생산입니다.

하지만이 문제를 스스로 찾아내는 방법을 이해하려면이 질문과 답변에 걸려 넘어지는 급우 중 누구에게나 더 유용 할 것입니다.

StackOverflow는 "Minimal, Complete and Verifiable Example" (MCVE)을 제공 할 것을 권장하며 잠시 시간을내어 도움말 페이지를 읽어 보시기 바랍니다. 우리가 질문이있는 사람들에게 삶을 어렵게하기 때문에 요청은 아닙니다. 문제를 최소한으로 줄이는 것이 디버깅의 핵심 부분이기 때문에 습관이되면 문제를 발견 할 때 더 나아질 수 있습니다. 물론, 그것은 또한 모든 관련없는 소음을 제거하기 때문에 문제를 해결하는 데 도움이되는 모든 사람을 돕습니다.

그러나 MCVE는 작지 않습니다. 입니다. 즉, 실제로 문제를 나타내는 발췌 부분입니다. "나는 문제가 여기에 있다고 생각한다. 그래서 나는이 부분을 보여 주겠다." 실제로 을 증명해야합니다. 최소한의 예제를 생성하고 실제로 같은 문제를 일으킨다 고 생각하는 곳에 문제가 있다고 생각하십시오.

실제로이 전략을 핵심으로 생각하면 프로그램을 다른 방식으로 작성하게됩니다. 수천 줄의 코드를 코딩 한 다음 컴파일러에 모두 제공하는 대신, 자급 자족이 적은 부분을 작성하고 전체를 결합하기 전에 각각을 검사합니다. 그런 식으로 특정 문제를 파악할 수 없으면 이미 MCVE가 있습니다.

문법은 귀찮게 상호 연결되어 있으며 프로그램을 좋아할만큼 모듈 식은 아닙니다. 한 생산에서 약간의 변화는 다른 일종의 완전 무관 한 생산과 관련된 교대 - 감소 충돌을 일으킬 수 있습니다. 그럼에도 불구하고 문법을 더 많거나 적은 개별 구성 요소로 분할 할 수 있습니다. 변화의 숫자를 생성

%token PROGRAM 
%token IDENTIFIER 
%token DECIMAL_CONSTANT 
%token DECLARE ENDDECLARE 

%token AND CALL DEFAULT 
%token FUNCTION PROCEDURE IN INOUT 
%token IF ELSE DO WHILE FOR OR NOT SELECT 
%token RETURN EXIT PRINT 
%token EQ_LT EQ_GT NE EXACT 
%left '+' '-' 
%right '*' '/' 

%% 

expression 
     : optional_sign term add_oper_term 
     ; 
add_oper_term 
     : add_oper term 
     | add_oper term add_oper_term 
     ; 
term   
     : factor mul_oper_factor 
     ; 
mul_oper_factor 
     : mul_oper factor 
     | mul_oper factor mul_oper_factor 
     ; 
factor 
     : DECIMAL_CONSTANT 
     | expression 
     | IDENTIFIER idtail 
     ; 
idtail 
     : %empty 
     | actualpars 
     ; 
add_oper 
     : '+' 
     | '-' 
     ; 
mul_oper 
     : '*' 
     | '/' 
     ; 
optional_sign 
     : add_oper 
     | %empty 
     ; 

actualpars 
     : '('')' 
     | '('actualparlist')' 
     ; 
actualparlist 
     : actualparitem 
     | actualparlist ',' 
     ; 
actualparitem 
     : IN expression 
     | INOUT IDENTIFIER 
     ; 

을/당신이 해결해야 할 갈등을 절감 할 수는 있지만 아무 쓸모 제작이 없습니다 : 예를 들어, 표현식을 정의하는 문법의 단지 부분 시작할 수 있습니다. (내가 %token 선언을 모두 남겨 두었 기 때문에, 위의 것은 이 아님) Bison은 사용하지 않는 터미널을 선언해도 상관하지 않으므로 다음 번에 선언을 그대로 두는 것이 더 쉽습니다 . 단계)

단계를 이동, 우리는 추가 포함하는, condition을 추가 할 수 있습니다

condition 
     : boolterm or_boolterm 
     ; 
or_boolterm 
     : OR boolterm 
     | OR boolterm or_boolterm 
     ; 
boolterm  
     : boolfactor and_boolfactor 
     ; 
and_boolfactor 
     : AND boolfactor 
     | AND boolfactor and_boolfactor 
     ; 
boolfactor 
     : NOT '[' condition ']' 
     | '[' condition ']' 
     | expression relational_oper expression 
     ; 
relational_oper 
     : '=' 
     | '<' 
     | "<=" 
     | "<>" 
     | ">=" 
     | '>' 
     ; 

지금이/더 변화없는 충돌을 줄일 수 있지만, 여전히 쓸모가 아닌 터미널.

다음 단계는 productions 문을 추가하는 것입니다.여기, 우리는 많은 문이 정의 된 비 터미널 brack_or_stat를 사용하는 것을 발견 할 것이다 : 아직 brackets_seq을 다루는 피하기 위해

brack_or_stat 
    : brackets_seq 
    | statement 
    ; 

, 우리는 일시적으로 터미널 목록에 추가 할 수 있습니다. (이것은 문법 사항을 숨기기위한 표준 기술이다.) 나중에 우리가 brackets_seq의 제작을 포함 할 때, 갈등을 줄이기/더 많은 변화를 우리는. %token 선언을 제거 할 수 있습니다) 그래서 우리는 지금

%token brackets_seq 

before the `%%`, and the statement productions after it: 

brack_or_stat 
     : brackets_seq 
     | statement 
     ; 

statement 
     : %empty 
     | assignment_stat 
     | if_stat 
     | do_while_stat 
     | while_stat 
     | select_stat 
     | exit_stat 
     | return_stat 
     | print_stat 
     | call_stat 
     ; 
assignment_stat 
      : IDENTIFIER EXACT IDENTIFIER 
      ; 

if_stat 
     : IF '(' condition')' brack_or_stat elsepart 
     ; 
elsepart 
     : %empty 
     | ELSE brack_or_stat 
     ; 
while_stat 
     : WHILE '(' condition')' brack_or_stat 
     ; 
select_stat 
     : SELECT'(' IDENTIFIER')' 
      dec 
      DEFAULT":" brack_or_stat 
     ; 
dec 
     : DECIMAL_CONSTANT ':' brack_or_stat 
     | dec ',' 
     ; 
do_while_stat 
     : DO brack_or_stat WHILE '(' condition ')' 
     ; 
exit_stat 
     : EXIT 
     ; 
return_stat 
     : RETURN '(' expression ')' 
     ; 
print_stat 
     : PRINT '('expression ')' 
     ; 
call_stat 
     : CALL IDENTIFIER actualpars 
     ; 

지금 거기에 추가 , 쓸모없는 비 터미널은 없다.

이제 문법의 절반 이상을 살펴 보았습니다. 문제는 우리가 살펴본 부분이 아니라고 합리적으로 확신합니다. (해결해야 할 다른 많은 문제가 남아 있지만)

따라서 statement이 OK라고 가정하면이를 터미널로 만들고 테스트에서 참조하는 모든 비 터미널을 제거하십시오. 즉, 훨씬 간단 프로그램으로 우리를 잎 : (. 내가 때이 발췌를 복사하여 붙여 넣기와 들소를 통해 실행, 그것은 정의되지 않은 assignment_stat 그래서 난 그냥 %token 선언을 추가 한 저를 알렸다.)

%token PROGRAM 
%token IDENTIFIER 
%token DECIMAL_CONSTANT 
%token DECLARE ENDDECLARE 

%token AND CALL DEFAULT 
%token FUNCTION PROCEDURE IN INOUT 
%token IF ELSE DO WHILE FOR OR NOT SELECT 
%token RETURN EXIT PRINT 
%token EQ_LT EQ_GT NE EXACT 

%token statement assignment_stat 

%start program 
%% 

program 
     : %empty 
     | PROGRAM IDENTIFIER block 
     ; 

block 
     : "{" declarations subprograms sequence "}" 
     ; 
declarations 
     : %empty 
     | DECLARE varlist ENDDECLARE 
     ; 
varlist 
     : %empty 
     | assignment_stat identifier2 
     ; 

identifier2 : ',' assignment_stat 
     | ',' assignment_stat 

     ; 
subprograms 
     : func 
     | subprograms ',' 
     ; 
func   
     : PROCEDURE IDENTIFIER funcbody 
     | FUNCTION IDENTIFIER funcbody 
     ; 
funcbody  
     : formalpars block 
     ; 
formalpars 
     : '('')' 
     | '(' formalparlist ')' 

     ; 
formalparlist 
     : formalparitem 
     | formalparlist ',' 

     ; 
formalparitem 
     : IN IDENTIFIER 
     | INOUT IDENTIFIER 
     ;  
sequence 
     : statement statement_sequence 
     ; 
statement_sequence 
     : ";"statement 
     | ';' statement statement_sequence 
     ; 
brackets_seq  
     : '{' sequence '}' 
     ; 
brack_or_stat 
     : brackets_seq 
     | statement 
     ; 

이제 "쓸모없는 비 터미널"경고로 가득 찬 화면이 생겼습니다.

그러나 이제 문법이 훨씬 간단 해졌습니다. (.. 충분히 간단하지 못하는 경우, 당신은 하나의 가능성은 예를 들어, 선언을 분리하는 것입니다 단순화 운동을 계속 할 수) 그리고 사실, 문제는 볼 수 있습니다 :

subprograms 
     : func 
     | subprograms ',' 
func : PROCEDURE IDENTIFIER funcbody 
     | FUNCTION IDENTIFIER funcbody 
funcbody: formalpars block 
block: "{" declarations subprograms sequence "}" 

주의는 무엇인가 여기서 일어나는 것 : subprograms에는 2 개의 작품이 있습니다. 두 번째 것은 분명히 재귀 적입니다. 그러나 다른 하나도 재귀적임을 확인하는 데는 거의 작업이 필요하지 않습니다. func에는 두 개의 프로덕션이 있지만 모두 funcbody을 사용합니다. funcbody의 유일한 생산품은 block이고, blocksubprograms입니다.

따라서 subprograms에는 비 재귀 적 생산이 없으므로 결코 재귀를 벗어날 수 없습니다. 둘 다 func, funcbody 또는 block 일 수 없습니다.

그러나 block 어떤 문장을 생성 할 수없는 경우, 다음 program ( PROGRAM IDENTIFIER block)의 두 번째 생산도 시작 심볼에 대한에만 유효 생산으로 program: %empty를 떠나, 어떤 문장을 생성 할 수 없습니다. 즉, 빈 문자열은 program 만 유효하며, 따라서 비손말은 다른 모든 비 단말기를 쓸모없는 것으로 표시합니다.

이제는 subprograms으로 돌아가 보겠습니다. (처음에는 말했듯이 즉각적인 문제입니다). 정의는 다음과 같습니다.

subprograms 
     : func 
     | subprograms ',' 

이제 매우 이상한 정의입니다. (이상하게 생각됩니다. 문법 전반에 걸쳐 반복됩니다.) 이게 무슨 소리 야? 그 subprogramsfunc 또는 subprograms이고 뒤에는 쉼표가옵니다. 그래서 생산할 것이다 :

func 
func , 
func , , 
func , , , 
func , , , , 

등등.단일 func, 0 개 이상의 쉼표. 에 하나의 기능이 있어야하며 그 이상은 가질 수 없습니다.

비워 둘 수 없다는 사실은 무한 재귀의 원인입니다. block에는 subprograms이 포함되어야하고 subprograms에는 func이 포함되어야합니다. 하지만 func에는 block이 포함되어야합니다. 그리고 회전 목마에서 탈출구는 없습니다.

여기에는 두 가지 문제가 있습니다. subprograms은 비워 둘 수 없으며 둘 이상의 func을 포함 할 수 없습니다. 당신이 아마 찾고 있던 것은이었다 function_list 왼쪽 재귀를 사용

function_list: func 
      | function_list ',' func 
subprograms : %empty 
      | function_list 

하는 것으로. 그것은 신중했다. Bison은 왼쪽 재귀를 좋아하는 LR 파서를 생성합니다.

이전에 LL 파서를 연구하고 머리에 회귀가 남아 있다고 생각하면 을 잊어 버렸습니다. LL 파서는 왼쪽 재귀를 처리 할 수 ​​없지만 LR 파서는 왼쪽 및 오른쪽 재귀를 모두 처리 할 수 ​​있으며 왼쪽 재귀를보다 잘 처리 할 수 ​​있습니다 (파서 스택을 먹지 않기 때문에).

+0

전체 답변을 읽었으나 맨 아래부터 시작하여'code'function_list'code'에 대한 또 다른 문법 규칙을 작성했습니다. 갑자기 거의 모든 경고가 사라졌습니다. 바이슨에 관한 현재의 질문으로 이어집니다. 아마도 다른 클래스 메이트의 다른 톱에서 보았을 때, 우리는'code' 서브 프로그램을 말하는 서브 프로그램에 대한 규칙을 가지고 있습니다 : (func) * 적어도 하나의'code' 함수 코드가 있어야 함을 의미한다고 생각합니다. 더. 그래서 내가 재귀 적으로 만들었고 모든 경고를 받았다. 나는 내 생각이 좀 어리 석다는 것을 알고 있지만 바이슨에서 그렇게 쉽게하는 방법이 있나? –

+0

@giannis : cfg가 작동하는 방식입니다. 반복하지 않는 유일한 방법은 재귀입니다. 내 대답의 끝 부분에있는 작품은 쉼표로 구분 된 선택적인 목록입니다. 구분 기호가 필요 없다면 더 간단합니다 :'thing_list : % empty | thing_list 일'. 첫 번째 시도와의 차이점을 이해해야합니다. – rici

+0

예 차이점을 이해했습니다. 도움과 당신의 시간 rici에 감사드립니다! –