📄 reduce.at
字号:
# Exercising Bison Grammar Reduction. -*- Autotest -*-# Copyright (C) 2001, 2002 Free Software Foundation, Inc.# This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 2, or (at your option)# any later version.# This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# GNU General Public License for more details.# You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA# 02110-1301, USA.AT_BANNER([[Grammar Reduction.]])## ------------------- #### Useless Terminals. #### ------------------- ##AT_SETUP([Useless Terminals])AT_DATA([[input.y]],[[%verbose%output="input.c"%token useless1%token useless2%token useless3%token useless4%token useless5%token useless6%token useless7%token useless8%token useless9%token useful%%exp: useful;]])AT_CHECK([[bison input.y]])AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,[[Terminals which are not used useless1 useless2 useless3 useless4 useless5 useless6 useless7 useless8 useless9]])AT_CLEANUP## ---------------------- #### Useless Nonterminals. #### ---------------------- ##AT_SETUP([Useless Nonterminals])AT_DATA([[input.y]],[[%verbose%output="input.c"%nterm useless1%nterm useless2%nterm useless3%nterm useless4%nterm useless5%nterm useless6%nterm useless7%nterm useless8%nterm useless9%token useful%%exp: useful;]])AT_CHECK([[bison input.y]], 0, [],[[input.y: warning: 9 useless nonterminalsinput.y:4.8-15: warning: useless nonterminal: useless1input.y:5.8-15: warning: useless nonterminal: useless2input.y:6.8-15: warning: useless nonterminal: useless3input.y:7.8-15: warning: useless nonterminal: useless4input.y:8.8-15: warning: useless nonterminal: useless5input.y:9.8-15: warning: useless nonterminal: useless6input.y:10.8-15: warning: useless nonterminal: useless7input.y:11.8-15: warning: useless nonterminal: useless8input.y:12.8-15: warning: useless nonterminal: useless9]])AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,[[Useless nonterminals useless1 useless2 useless3 useless4 useless5 useless6 useless7 useless8 useless9]])AT_CLEANUP## --------------- #### Useless Rules. #### --------------- ##AT_SETUP([Useless Rules])AT_KEYWORDS([report])AT_DATA([[input.y]],[[%verbose%output="input.c"%token useful%%exp: useful;useless1: '1';useless2: '2';useless3: '3';useless4: '4';useless5: '5';useless6: '6';useless7: '7';useless8: '8';useless9: '9';]])AT_CHECK([[bison input.y]], 0, [],[[input.y: warning: 9 useless nonterminals and 9 useless rulesinput.y:6.1-8: warning: useless nonterminal: useless1input.y:7.1-8: warning: useless nonterminal: useless2input.y:8.1-8: warning: useless nonterminal: useless3input.y:9.1-8: warning: useless nonterminal: useless4input.y:10.1-8: warning: useless nonterminal: useless5input.y:11.1-8: warning: useless nonterminal: useless6input.y:12.1-8: warning: useless nonterminal: useless7input.y:13.1-8: warning: useless nonterminal: useless8input.y:14.1-8: warning: useless nonterminal: useless9input.y:6.11-13: warning: useless rule: useless1: '1'input.y:7.11-13: warning: useless rule: useless2: '2'input.y:8.11-13: warning: useless rule: useless3: '3'input.y:9.11-13: warning: useless rule: useless4: '4'input.y:10.11-13: warning: useless rule: useless5: '5'input.y:11.11-13: warning: useless rule: useless6: '6'input.y:12.11-13: warning: useless rule: useless7: '7'input.y:13.11-13: warning: useless rule: useless8: '8'input.y:14.11-13: warning: useless rule: useless9: '9']])AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,[[Useless nonterminals useless1 useless2 useless3 useless4 useless5 useless6 useless7 useless8 useless9Terminals which are not used '1' '2' '3' '4' '5' '6' '7' '8' '9'Useless rules 2 useless1: '1' 3 useless2: '2' 4 useless3: '3' 5 useless4: '4' 6 useless5: '5' 7 useless6: '6' 8 useless7: '7' 9 useless8: '8' 10 useless9: '9']])AT_CLEANUP## ------------------- #### Reduced Automaton. #### ------------------- ### Check that the automaton is that as the for the grammar reduced by# hand.AT_SETUP([Reduced Automaton])AT_KEYWORDS([report])# The non reduced grammar.# ------------------------AT_DATA([[not-reduced.y]],[[/* A useless token. */%token useless_token/* A useful one. */%token useful%verbose%output="not-reduced.c"%%exp: useful { /* A useful action. */ } | non_productive { /* A non productive action. */ } ;not_reachable: useful { /* A not reachable action. */ } ;non_productive: non_productive useless_token { /* Another non productive action. */ } ;%%]])AT_CHECK([[bison not-reduced.y]], 0, [],[[not-reduced.y: warning: 2 useless nonterminals and 3 useless rulesnot-reduced.y:14.1-13: warning: useless nonterminal: not_reachablenot-reduced.y:11.6-19: warning: useless nonterminal: non_productivenot-reduced.y:11.6-57: warning: useless rule: exp: non_productivenot-reduced.y:14.16-56: warning: useless rule: not_reachable: usefulnot-reduced.y:17.17-18.63: warning: useless rule: non_productive: non_productive useless_token]])AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0,[[Useless nonterminals not_reachable non_productiveTerminals which are not used useless_tokenUseless rules 2 exp: non_productive 3 not_reachable: useful 4 non_productive: non_productive useless_token]])# The reduced grammar.# --------------------AT_DATA([[reduced.y]],[[/* A useless token. */%token useless_token/* A useful one. */%token useful%verbose%output="reduced.c"%%exp: useful { /* A useful action. */ }// | non_productive { /* A non productive action. */ } */ ;//not_reachable: useful { /* A not reachable action. */ }// ;//non_productive: non_productive useless_token// { /* Another non productive action. */ }// ;%%]])AT_CHECK([[bison reduced.y]])# Comparing the parsers.cp reduced.c expoutAT_CHECK([sed 's/not-reduced/reduced/g' not-reduced.c], 0, [expout])AT_CLEANUP## ------------------- #### Underivable Rules. #### ------------------- ##AT_SETUP([Underivable Rules])AT_KEYWORDS([report])AT_DATA([[input.y]],[[%verbose%output="input.c"%token useful%%exp: useful | underivable;underivable: indirection;indirection: underivable;]])AT_CHECK([[bison input.y]], 0, [],[[input.y: warning: 2 useless nonterminals and 3 useless rulesinput.y:5.15-25: warning: useless nonterminal: underivableinput.y:6.14-24: warning: useless nonterminal: indirectioninput.y:5.15-25: warning: useless rule: exp: underivableinput.y:6.14-24: warning: useless rule: underivable: indirectioninput.y:7.14-24: warning: useless rule: indirection: underivable]])AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0,[[Useless nonterminals underivable indirectionUseless rules 2 exp: underivable 3 underivable: indirection 4 indirection: underivable]])AT_CLEANUP## ---------------- #### Empty Language. #### ---------------- ##AT_SETUP([Empty Language])AT_DATA([[input.y]],[[%output="input.c"%%exp: exp;]])AT_CHECK([[bison input.y]], 1, [],[[input.y: warning: 2 useless nonterminals and 2 useless rulesinput.y:3.1-3: fatal error: start symbol exp does not derive any sentence]])AT_CLEANUP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -