首页
编程语言
数据库
网络开发
Algorithm算法
移动开发
系统相关
金融统计
人工智能
其他
首页
>
> 详细
辅导Python编程|辅导R语言程序|讲解R语言编程|解析C/C++编程
Assignment 5
cpe 357 Winter 2018
As soon as we started programming, we found to our surprise that it wasn’t
as easy to get programs right as we had thought. Debugging had to be
discovered. I can remember the exact instant when I realized that a large
part of my life from then on was going to be spent in finding mistakes in
my own programs.
-- Maurice Wilkes, designer of EDSAC, on programming, 1949
— /usr/games/fortune
Due by 11:59:59pm, Wednesday, March 7th.
For this assignment you may work with a partner1. Be sure both names appear in the README.
Program: parseline
Shell command-line parsing:
This assignment is to do the command-line parsing necessary for the Minimally Useful SHell
(mush) that will be the subject of Asgn 6.
The Minimally Useful SHell (mush) has nowhere near the functionality of a full-blown shell like
/bin/sh or /bin/csh, but it does support both file redirection and pipes. parseline is a subset
of the shell that prompts for and reads a single mush command-line and parses it into a list of
commands showing the inputs, outputs, and arguments of each.
Details
The grammar of mush is fairly simple:
? A command (pipeline stage) consists of a command name followed by its arguments, separated
by whitespace.
? A command’s standard input and standard out can be redirected from or into files via the use
of < (standard in) and > (standard out). The filename for the redirection is the single word
following the redirection symbol. A missing name names constitutes an error.
The redirection symbol and filename are not considered part of the command name or argument
list and are not included in the count of arguments.
? A pipe (|) connects the standard output of one command to the standard input of the following
one. For example, “ls | sort” makes the output of ls the input of sort. A series of
commands separated by pipes is a pipeline.
? You can assume that ’<’, ’>’, and ’|’ will appear as words by themselves with space around
them. That is, you don’t have to deal with “ls b
’>’, and ’|’ are not valid filenames, so “a.out > < a” is an error, not the creation of a file
called “<.”
Note, however, that redirections will not necessarily appear at the end of the command line.
That is, “ls > out a b” would be a legitimate command to list the files “a,” and “b” into
the file “out”.
1This will have to be a partner for both this assignment and Asgn 6.
1In order to make the process easier, you may apply certain limits to the command line structure.
These limits must be documented in your README file, and command-lines that are rejected for
exceeding limits must be reported as errors.
Command line length: at least 512 bytes
Commands in a pipeline: at least 10
Arguments to a command: at least 10
The fact that these maxima2 exist will allow you to avoid the use of dynamic data structures.
My initial version of this program did not have a single call to malloc() in it. (The current version
does.)
Error Handling
parseline must identify and report malformed commands. This includes:
? malformed redirects. For example, “a.out < ” doesn’t specify the name of the file for redirect
while “a.out < a < b” has two input redirects.
? ambiguous inputs or outputs. For example, in the pipeline “ls | sort < foo”, the input to
sort is specified to be two different things.
? command-lines that exceed any limits imposed (above).
Output
The purpose of parsing a command line is to identify the various components of each command so
that each can be launched appropriately. On a Unix system, one needs to know where the input will
come from, where the output will go, the number of arguments on the command line (not including
any redirection commands) and the values of those arguments.
In order for this program to be efficiently graded, it is important to adhere to the output format
specified below.
Error Cases When there is an error in one of the commands in the pipeline, parseline prints
an error message an exits with nonzero exit status. If there are multiple errors on a line, it prints
the the first one it encounters. Possible errors are shown in Table 1.
Valid Cases For syntactically correct pipelines, parseline should print out a description of
each stage of the pipeline in the form given below. For the sake of parseline, the first stage of a
pipeline will be stage 0. The required form of the output:
1. a header that identifies the stage number and shows the portion of the command line that
corresponds to that stage, in quotes. This header should follow a blank line and have the
following form:
--------
Stage n: "
"
--------
Example:
--------
Stage 0: "ls a b c "
--------
2The phrasing here is a little awkward. What it means is that you may apply a maximum limit for each of these
properties, but the value of your maximum must be at least as big as that given in the table above. That is, you can’t
define the maximum command line length to be 0 and be done.
2Cause Message
command line length limit exceeded command too long
pipeline has too many elements pipeline too deep
an individual command has exceeded
the limit on arguments
cmd: too many arguments
a pipeline has an empty stage, e.g.,
“ls | | more”
invalid null command
a command either has more then one
input redirection character (’<’), or
the input filename is missing
cmd: bad input redirection
a command either has more then one
output redirection character (’>’), or
the input filename is missing
cmd: bad output redirection
a stage has both an input redirect and
a pipe in
cmd: ambiguous input
a stage has both an output redirect
and a pipe out
cmd: ambiguous output
Table 1: Possible errors that mush will encounter
2. a specification of the input for the stage which will be one of:
a filename, if redirected
“original standard input”
“pipe from stage n”
Example:
input: original stdin
3. a specification of the output for the stage which will be one of:
a filename, if redirected
“original standard output”
“pipe to stage n”
Example:
output: pipe to stage 1
4. the argument count (argc) for the stage.
Example:
argc: 4
5. the arguments strings for the stage with extra whitespace trimmed off, in quotes, commaseparated.
Example:
argv: "ls","a","b","c"
3Tricks and Tools
Remember, parsing is always harder than it looks. Be sure to give some serious thought to your
approaches and data structures before diving in. There are many library routines and system calls
that may help with implementing parseline. Some of them are listed in Figure 1.
sscanf()
strchar()
index()
strtok()
strpbrk()
etc.
The string functions, defined in string.h and strings.h, are helpful
for parsing strings
isspace()
etc.
One of many functions defined in ctype.h for text processing. Very
useful.
Figure 1: Some potentially useful system calls and library functions
A few thoughts:
? You can find out the number of stages in the pipeline by counting number of times the pipe
character (|) appears and adding 1.
? You only need to report the first error you find, so you can abort processing once you find one.
? Be far-sighted about this. Read the specification for the full version of mush before starting
so you will know where you want to end up. You want to make design decisions you can live
with next week.
? Remember that although parsing looks easy it it harder than it looks. There are a lot of edge
cases.
Coding Standards and Make
See the pages on coding standards and make on the cpe 357 class web page.
What to turn in
Submit via handin to the asgn5 directory of the pn-cs357 account:
? your well-documented source files.
? A makefile (called Makefile) that will build your program with the command “make parseline”.
? A README file that contains:
– Your name(s). In addition to your names, please include your Cal Poly login names with
it, in parentheses. E.g. (pnico)
– Any special instructions for running your program.
– Any other thing you want me to know while I am grading it.
4The README file should be plain text, and should be named “README”, all capitals with
no extension.
Sample Runs
Below are some sample runs of parseline. I will also place an executable version on the CSL
in ~pn-cs357/demos so you can run it yourself.
% parseline
line: ls
--------
Stage 0: "ls"
--------
input: original stdin
output: original stdout
argc: 1
argv: "ls"
% parseline
line: ls < one > two three four
--------
Stage 0: "ls < one > two three four"
--------
input: one
output: two
argc: 3
argv: "ls","three","four"
% parseline
line: ls < one | more | sort
--------
Stage 0: "ls < one "
--------
input: one
output: pipe to stage 1
argc: 1
argv: "ls"
--------
Stage 1: " more "
--------
input: pipe from stage 0
output: pipe to stage 2
argc: 1
argv: "more"
--------
Stage 2: " sort"
--------
5input: pipe from stage 1
output: original stdout
argc: 1
argv: "sort"
% parseline
line: ls | | more
invalid null command
% parseline
line: ls < a < b | more
ls: bad input redirection
% parseline
line: ls < a | more < file
more: ambiguous input
% parseline
line: ls < a < b > c > d
ls: bad input redirection
%
联系我们
QQ:99515681
邮箱:99515681@qq.com
工作时间:8:00-21:00
微信:codinghelp
热点文章
更多
辅导 comm2000 creating socia...
2026-01-08
讲解 isen1000 – introductio...
2026-01-08
讲解 cme213 radix sort讲解 c...
2026-01-08
辅导 csc370 database讲解 迭代
2026-01-08
讲解 ca2401 a list of colleg...
2026-01-08
讲解 nfe2140 midi scale play...
2026-01-08
讲解 ca2401 the universal li...
2026-01-08
辅导 engg7302 advanced compu...
2026-01-08
辅导 comp331/557 – class te...
2026-01-08
讲解 soft2412 comp9412 exam辅...
2026-01-08
讲解 scenario # 1 honesty讲解...
2026-01-08
讲解 002499 accounting infor...
2026-01-08
讲解 comp9313 2021t3 project...
2026-01-08
讲解 stat1201 analysis of sc...
2026-01-08
辅导 stat5611: statistical m...
2026-01-08
辅导 mth2010-mth2015 - multi...
2026-01-08
辅导 eeet2387 switched mode ...
2026-01-08
讲解 an online payment servi...
2026-01-08
讲解 textfilter辅导 r语言
2026-01-08
讲解 rutgers ece 434 linux o...
2026-01-08
热点标签
mktg2509
csci 2600
38170
lng302
csse3010
phas3226
77938
arch1162
engn4536/engn6536
acx5903
comp151101
phl245
cse12
comp9312
stat3016/6016
phas0038
comp2140
6qqmb312
xjco3011
rest0005
ematm0051
5qqmn219
lubs5062m
eee8155
cege0100
eap033
artd1109
mat246
etc3430
ecmm462
mis102
inft6800
ddes9903
comp6521
comp9517
comp3331/9331
comp4337
comp6008
comp9414
bu.231.790.81
man00150m
csb352h
math1041
eengm4100
isys1002
08
6057cem
mktg3504
mthm036
mtrx1701
mth3241
eeee3086
cmp-7038b
cmp-7000a
ints4010
econ2151
infs5710
fins5516
fin3309
fins5510
gsoe9340
math2007
math2036
soee5010
mark3088
infs3605
elec9714
comp2271
ma214
comp2211
infs3604
600426
sit254
acct3091
bbt405
msin0116
com107/com113
mark5826
sit120
comp9021
eco2101
eeen40700
cs253
ece3114
ecmm447
chns3000
math377
itd102
comp9444
comp(2041|9044)
econ0060
econ7230
mgt001371
ecs-323
cs6250
mgdi60012
mdia2012
comm221001
comm5000
ma1008
engl642
econ241
com333
math367
mis201
nbs-7041x
meek16104
econ2003
comm1190
mbas902
comp-1027
dpst1091
comp7315
eppd1033
m06
ee3025
msci231
bb113/bbs1063
fc709
comp3425
comp9417
econ42915
cb9101
math1102e
chme0017
fc307
mkt60104
5522usst
litr1-uc6201.200
ee1102
cosc2803
math39512
omp9727
int2067/int5051
bsb151
mgt253
fc021
babs2202
mis2002s
phya21
18-213
cege0012
mdia1002
math38032
mech5125
07
cisc102
mgx3110
cs240
11175
fin3020s
eco3420
ictten622
comp9727
cpt111
de114102d
mgm320h5s
bafi1019
math21112
efim20036
mn-3503
fins5568
110.807
bcpm000028
info6030
bma0092
bcpm0054
math20212
ce335
cs365
cenv6141
ftec5580
math2010
ec3450
comm1170
ecmt1010
csci-ua.0480-003
econ12-200
ib3960
ectb60h3f
cs247—assignment
tk3163
ics3u
ib3j80
comp20008
comp9334
eppd1063
acct2343
cct109
isys1055/3412
math350-real
math2014
eec180
stat141b
econ2101
msinm014/msing014/msing014b
fit2004
comp643
bu1002
cm2030
联系我们
- QQ: 99515681 微信:codinghelp
© 2024
www.7daixie.com
站长地图
程序辅导网!