亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? yacc-docs.txt

?? 句法分析器。一般用文法(grammar)來刻畫.常見的是短語結構文法(chomsky hierarchy),其中最常用的是上下文無關文法(CFG)。
?? TXT
?? 第 1 頁 / 共 5 頁
字號:
http://www.csc.calpoly.edu/~gfisher/450/doc/yacc/paper.txt


Yacc: Yet Another Compiler-Compiler                      PS1:15-1





               Yacc: Yet Another Compiler-Compiler


                       Stephen C. Johnson

                     AT&T Bell Laboratories
                  Murray Hill, New Jersey 07974


                            ABSTRACT


          Computer program input generally has  some  struc-
     ture;  in  fact, every computer program that does input
     can be thought of as  defining  an  ``input  language''
     which  it accepts.  An input language may be as complex
     as a programming language, or as simple as  a  sequence
     of  numbers.  Unfortunately, usual input facilities are
     limited, difficult to use,  and  often  are  lax  about
     checking their inputs for validity.

          Yacc provides a general tool  for  describing  the
     input  to  a computer program.  The Yacc user specifies
     the structures of his input, together with code  to  be
     invoked  as  each  such  structure is recognized.  Yacc
     turns such a specification into a subroutine that  han-
     dles  the  input  process; frequently, it is convenient
     and appropriate to have most of the flow of control  in
     the user's application handled by this subroutine.

          The input subroutine  produced  by  Yacc  calls  a
     user-supplied  routine  to  return the next basic input
     item.  Thus, the user can specify his input in terms of
     individual  input  characters,  or  in  terms of higher
     level constructs such as names and numbers.  The  user-
     supplied  routine  may  also  handle idiomatic features
     such as comment  and  continuation  conventions,  which
     typically defy easy grammatical specification.

          Yacc is written  in  portable  C.   The  class  of
     specifications  accepted is a very general one: LALR(1)
     grammars with disambiguating rules.

          In addition to compilers for C, APL, Pascal,  RAT-
     FOR,  etc.,  Yacc  has  also been used for less conven-
     tional languages, including a phototypesetter language,
     several desk calculator languages, a document retrieval
     system, and a Fortran debugging system.












PS1:15-2                      Yacc: Yet Another Compiler-Compiler


0: Introduction

     Yacc provides a general tool for imposing structure  on  the
input to a computer program.  The Yacc user prepares a specifica-
tion of the input process; this  includes  rules  describing  the
input  structure,  code to be invoked when these rules are recog-
nized, and a low-level routine to do the basic input.  Yacc  then
generates  a  function  to control the input process.  This func-
tion, called a parser, calls the  user-supplied  low-level  input
routine (the lexical analyzer) to pick up the basic items (called
tokens) from  the  input  stream.   These  tokens  are  organized
according  to  the  input  structure rules, called grammar rules;
when one of these rules has been recognized, then user code  sup-
plied  for  this  rule,  an  action, is invoked; actions have the
ability to return values and make use  of  the  values  of  other
actions.

     Yacc is written in  a  portable  dialect  of  C[1]  and  the
actions, and output subroutine, are in C as well.  Moreover, many
of the syntactic conventions of Yacc follow C.

     The heart of the input  specification  is  a  collection  of
grammar  rules.   Each  rule describes an allowable structure and
gives it a name.  For example, one grammar rule might be

        date  :  month_name  day  ','  year   ;

Here, date, month_name, day, and  year  represent  structures  of
interest  in  the input process; presumably, month_name, day, and
year are defined elsewhere.  The comma ``,'' is enclosed in  sin-
gle quotes; this implies that the comma is to appear literally in
the input.  The colon and semicolon merely serve  as  punctuation
in  the  rule, and have no significance in controlling the input.
Thus, with proper definitions, the input

        July  4, 1776

might be matched by the above rule.

     An important part of the input process is carried out by the
lexical  analyzer.   This  user  routine  reads the input stream,
recognizing the lower level structures,  and  communicates  these
tokens to the parser.  For historical reasons, a structure recog-
nized by the lexical analyzer is called a terminal symbol,  while
the  structure  recognized  by the parser is called a nonterminal
symbol.  To avoid confusion, terminal  symbols  will  usually  be
referred to as tokens.

     There is considerable leeway in deciding whether  to  recog-
nize structures using the lexical analyzer or grammar rules.  For
example, the rules












Yacc: Yet Another Compiler-Compiler                      PS1:15-3



        month_name  :  'J' 'a' 'n'   ;
        month_name  :  'F' 'e' 'b'   ;

                 . . .

        month_name  :  'D' 'e' 'c'   ;

might be used in the above example.  The lexical  analyzer  would
only  need  to recognize individual letters, and month_name would
be a nonterminal symbol.  Such low-level rules tend to waste time
and  space,  and  may  complicate the specification beyond Yacc's
ability to deal with it.  Usually,  the  lexical  analyzer  would
recognize  the  month  names,  and  return  an  indication that a
month_name was seen; in this case, month_name would be a token.

     Literal characters such as ``,'' must also be passed through
the lexical analyzer, and are also considered tokens.

     Specification files are very flexible.  It is realively easy
to add to the above example the rule

        date  :  month '/' day '/' year   ;

allowing

        7 / 4 / 1776

as a synonym for

        July 4, 1776

In most cases, this new rule could be ``slipped in'' to a working
system  with  minimal  effort,  and  little  danger of disrupting
existing input.

     The input being read may not conform to the  specifications.
These input errors are detected as early as is theoretically pos-
sible with a left-to-right scan; thus, not only is the chance  of
reading  and computing with bad input data substantially reduced,
but the bad data can usually be quickly found.   Error  handling,
provided as part of the input specifications, permits the reentry
of bad data, or the continuation of the input process after skip-
ping over the bad data.

     In some cases, Yacc fails to produce a parser when  given  a
set  of  specifications.   For example, the specifications may be
self contradictory, or they may require a more powerful  recogni-
tion  mechanism  than  that  available to Yacc.  The former cases
represent design errors; the latter cases can often be  corrected
by  making  the  lexical  analyzer more powerful, or by rewriting
some of the grammar rules.  While Yacc cannot handle all possible
specifications,  its  power  compares favorably with similar sys-
tems; moreover, the constructions which are difficult for Yacc to









PS1:15-4                      Yacc: Yet Another Compiler-Compiler


handle  are also frequently difficult for human beings to handle.
Some users have reported that the discipline of formulating valid
Yacc specifications for their input revealed errors of conception
or design early in the program development.

     The theory underlying Yacc has been described  elsewhere.[2,
3, 4] Yacc has been extensively used in numerous practical appli-
cations, including lint,[5] the Portable  C  Compiler,[6]  and  a
system for typesetting mathematics.[7]

     The next several sections  describe  the  basic  process  of
preparing  a Yacc specification; Section 1 describes the prepara-
tion of grammar rules, Section 2 the preparation of the user sup-
plied  actions  associated  with  these  rules, and Section 3 the
preparation of lexical analyzers.  Section 4 describes the opera-
tion of the parser.  Section 5 discusses various reasons why Yacc
may be unable to produce a parser from a specification, and  what
to  do about it.  Section 6 describes a simple mechanism for han-
dling operator precedences in arithmetic expressions.  Section  7
discusses  error detection and recovery.  Section 8 discusses the
operating environment and special features of  the  parsers  Yacc
produces.   Section 9 gives some suggestions which should improve
the style and  efficiency  of  the  specifications.   Section  10
discusses some advanced topics, and Section 11 gives acknowledge-
ments.  Appendix A has a brief example, and Appendix  B  gives  a
summary  of  the  Yacc input syntax.  Appendix C gives an example
using some of the more advanced features of Yacc,  and,  finally,
Appendix  D  describes  mechanisms  and syntax no longer actively
supported, but provided for historical continuity with older ver-
sions of Yacc.

1: Basic Specifications

     Names refer to either tokens or nonterminal  symbols.   Yacc
requires  token  names  to be declared as such.  In addition, for
reasons discussed in Section 3, it is often desirable to  include
the lexical analyzer as part of the specification file; it may be
useful to include other programs as well.  Thus, every specifica-
tion file consists of three sections: the declarations, (grammar)
rules, and programs.  The sections are separated by  double  per-
cent  ``%%'' marks.  (The percent ``%'' is generally used in Yacc
specifications as an escape character.)

     In other words, a full specification file looks like

        declarations
        %%
        rules
        %%
        programs


     The declaration section may be empty.  Moreover, if the pro-
grams section is omitted, the second %% mark may be omitted also;









Yacc: Yet Another Compiler-Compiler                      PS1:15-5


thus, the smallest legal Yacc specification is

        %%
        rules


     Blanks, tabs, and newlines are ignored except that they  may
not  appear  in  names or multi-character reserved symbols.  Com-
ments may appear wherever a name is legal; they are  enclosed  in
/* . . . */, as in C and PL/I.

     The rules section is made up of one or more  grammar  rules.
A grammar rule has the form:

        A  :  BODY  ;

A represents a nonterminal name, and BODY represents  a  sequence
of  zero or more names and literals.  The colon and the semicolon
are Yacc punctuation.

     Names may be of arbitrary length, and  may  be  made  up  of
letters,  dot  ``.'',  underscore  ``_'', and non-initial digits.
Upper and lower case letters are distinct.  The names used in the
body  of  a grammar rule may represent tokens or nonterminal sym-
bols.

     A literal consists of a character enclosed in single  quotes
``'''.   As  in  C,  the  backslash  ``\'' is an escape character
within literals, and all the C escapes are recognized.  Thus

        '\n'    newline
        '\r'    return
        '\''    single quote ``'''
        '\\'    backslash ``\''
        '\t'    tab
        '\b'    backspace
        '\f'    form feed
        '\xxx'  ``xxx'' in octal

For a number of technical reasons, the NUL character ('\0' or  0)
should never be used in grammar rules.

     If there are several grammar rules with the same  left  hand
side,  the  vertical bar ``|'' can be used to avoid rewriting the
left hand side.  In addition, the semicolon at the end of a  rule
can be dropped before a vertical bar.  Thus the grammar rules

        A       :       B  C  D   ;
        A       :       E  F   ;
        A       :       G   ;

can be given to Yacc as











PS1:15-6                      Yacc: Yet Another Compiler-Compiler



        A       :       B  C  D
                |       E  F
                |       G
                ;

It is not necessary that all grammar rules  with  the  same  left
side  appear  together  in the grammar rules section, although it
makes the input much more readable, and easier to change.

     If a nonterminal symbol matches the empty string,  this  can
be indicated in the obvious way:

        empty :   ;


     Names representing tokens must be  declared;  this  is  most
simply done by writing

        %token   name1  name2 . . .

in the declarations section.  (See Sections 3 , 5, and 6 for much
more  discussion).   Every  name  not defined in the declarations
section is assumed to represent a nonterminal symbol.  Every non-
terminal  symbol  must  appear  on  the left side of at least one
rule.

     Of all the nonterminal symbols, one, called the  start  sym-
bol, has particular importance.  The parser is designed to recog-
nize the start symbol; thus, this symbol represents the  largest,
most  general  structure  described  by  the  grammar  rules.  By
default, the start symbol is taken to be the left  hand  side  of
the first grammar rule in the rules section.  It is possible, and
in fact desirable, to declare the start symbol explicitly in  the
declarations section using the %start keyword:

        %start   symbol


     The end of the input to the parser is signaled by a  special
token,  called  the  endmarker.   If  the  tokens  up to, but not
including, the endmarker form a structure which matches the start
symbol,  the parser function returns to its caller after the end-

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品自拍偷拍动漫精品| 亚洲精品在线观看网站| 激情成人综合网| 欧美艳星brazzers| 国产美女精品人人做人人爽| 亚洲老妇xxxxxx| 日本高清视频一区二区| 国模一区二区三区白浆| 久久久久久久精| 337p亚洲精品色噜噜噜| 免费高清成人在线| 精品日韩99亚洲| 在线免费观看一区| 国产成人一级电影| 中文字幕一区二区日韩精品绯色| 欧美一区二区三区婷婷月色| 色综合天天做天天爱| 国产精品99久久久| 日本视频一区二区三区| 亚洲在线免费播放| 91精品欧美综合在线观看最新| 99re热这里只有精品视频| 一区二区三区国产豹纹内裤在线 | 色老汉一区二区三区| 亚洲一区二区在线视频| 中文成人综合网| 在线影院国内精品| aaa国产一区| 成人免费不卡视频| 国产精品 日产精品 欧美精品| 中文字幕高清一区| 精品视频色一区| 色哟哟在线观看一区二区三区| 成人精品小蝌蚪| 亚洲自拍另类综合| 一区二区三区在线影院| 日韩三级视频在线看| 欧美日韩电影在线| 欧美老肥妇做.爰bbww视频| 91国产免费看| 国产麻豆成人传媒免费观看| 日本成人在线视频网站| 日本不卡视频在线观看| 奇米色777欧美一区二区| 日韩精品亚洲专区| 日本一区中文字幕| 综合网在线视频| 亚洲人成电影网站色mp4| 欧美一级爆毛片| www.久久久久久久久| 蜜臀va亚洲va欧美va天堂 | 欧美高清在线一区二区| 欧美日韩大陆一区二区| 白白色亚洲国产精品| 蜜桃久久久久久| 韩国理伦片一区二区三区在线播放| 国产乱人伦精品一区二区在线观看| 亚洲黄色片在线观看| 精品国产污污免费网站入口| 欧美视频一二三区| 亚洲男同1069视频| 精品入口麻豆88视频| 2022国产精品视频| 欧美日韩在线综合| 99久久婷婷国产| 紧缚奴在线一区二区三区| 国内外精品视频| 日本v片在线高清不卡在线观看| 日韩电影在线免费| 麻豆91在线看| 高清成人免费视频| 在线这里只有精品| 日韩一级黄色大片| 欧美高清在线精品一区| www日韩大片| 日韩一区二区三区三四区视频在线观看| 色噜噜狠狠成人网p站| 91精品国产aⅴ一区二区| 91久久一区二区| 91精品在线观看入口| 国产欧美一二三区| 久久亚洲一区二区三区四区| 制服丝袜激情欧洲亚洲| 欧美亚洲高清一区| 精品人在线二区三区| 欧美一区二区观看视频| 国产精品网曝门| 午夜电影网亚洲视频| 亚洲午夜精品久久久久久久久| 久国产精品韩国三级视频| 日本vs亚洲vs韩国一区三区| 成人看片黄a免费看在线| 欧美日韩电影一区| 88在线观看91蜜桃国自产| 欧美日韩精品一二三区| 欧美日韩色一区| 国产午夜精品一区二区 | 激情都市一区二区| 在线观看www91| 日本高清不卡aⅴ免费网站| 91麻豆国产福利精品| 欧美mv日韩mv| 午夜精品久久久久久久蜜桃app| av资源网一区| 欧美第一区第二区| 亚洲国产成人va在线观看天堂| 国产精品 欧美精品| 日韩一区二区电影网| 久久综合久久综合久久综合| 亚洲精品一二三| 亚洲电影一区二区三区| 成人动漫视频在线| 色系网站成人免费| 欧美日韩在线免费视频| 国产精品国产三级国产普通话99| 麻豆免费精品视频| 国产成人精品综合在线观看| 99久久99久久精品国产片果冻| 91亚洲永久精品| 在线不卡的av| 亚洲精品一区在线观看| 国产精品免费丝袜| 国产精品1区二区.| 欧美成人精品二区三区99精品| 中文字幕av免费专区久久| 久久精品国产秦先生| 成人污污视频在线观看| 欧美日韩一区中文字幕| 亚洲人精品一区| 美国一区二区三区在线播放| 欧美日韩精品一区二区三区四区| 欧美精品一区二区三区四区| 免费成人小视频| 91丨porny丨在线| 日本二三区不卡| 日韩三级中文字幕| 麻豆免费精品视频| 精品久久久久久久人人人人传媒| 日韩和的一区二区| 国产精品538一区二区在线| 久久一区二区三区国产精品| 玉米视频成人免费看| 色综合天天狠狠| 欧美第一区第二区| 国产伦精品一区二区三区在线观看| 亚洲精品在线三区| 成人午夜激情片| 精品国产第一区二区三区观看体验| 一区二区三区四区五区视频在线观看 | 91精品国产全国免费观看| 欧美国产日本韩| 蜜桃久久av一区| 久久免费视频一区| 成人免费视频caoporn| 欧美成人精品3d动漫h| 亚洲成人免费视频| 99久久免费国产| 一区二区日韩电影| 日韩一级视频免费观看在线| 亚洲韩国精品一区| 91精品国产91久久久久久一区二区 | 中文字幕欧美激情一区| 国产成人午夜精品5599| thepron国产精品| 精品国产污污免费网站入口| 欧美国产欧美亚州国产日韩mv天天看完整| 国产无人区一区二区三区| 成熟亚洲日本毛茸茸凸凹| 欧美日韩免费不卡视频一区二区三区 | 国产综合久久久久久久久久久久| 91丨国产丨九色丨pron| 亚洲免费观看高清完整版在线| 91蜜桃在线免费视频| 亚洲动漫第一页| 色综合久久88色综合天天免费| 亚洲国产成人av好男人在线观看| 51精品秘密在线观看| 精品在线亚洲视频| 欧美剧情电影在线观看完整版免费励志电影| 久久老女人爱爱| 舔着乳尖日韩一区| 欧美大片免费久久精品三p| 国产激情视频一区二区在线观看 | 亚洲一区二区偷拍精品| 国产传媒久久文化传媒| 国产午夜精品一区二区三区嫩草| 欧美三级三级三级爽爽爽| 日韩理论片一区二区| 国产馆精品极品| 中文字幕亚洲欧美在线不卡| 欧美一区二区三区免费观看视频| 亚洲一区二区三区视频在线| 日韩一区二区免费电影| www.av亚洲| 亚洲精品成人悠悠色影视| 欧美一区二区视频免费观看| 亚洲国产人成综合网站| 国产欧美一区在线| 日韩精品专区在线影院重磅| 成人三级在线视频|