亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
免费视频一区二区| 欧美刺激午夜性久久久久久久| 国产日韩欧美制服另类| 国产91高潮流白浆在线麻豆| 国产性天天综合网| 97成人超碰视| 亚洲一区二区三区四区在线| 欧美精品 国产精品| 久久国产人妖系列| 国产女同互慰高潮91漫画| 成人av在线播放网址| 一区二区三区国产精品| 欧美日韩一区二区三区四区五区 | 国内精品视频一区二区三区八戒| 精品毛片乱码1区2区3区| 国产精品一卡二卡在线观看| 国产精品萝li| 欧美午夜电影网| 久久99久久久久| 最新日韩av在线| 欧美日韩成人综合在线一区二区| 国产在线国偷精品产拍免费yy| 欧美国产精品v| 欧美日韩在线精品一区二区三区激情| 日韩黄色片在线观看| 国产香蕉久久精品综合网| 93久久精品日日躁夜夜躁欧美| 舔着乳尖日韩一区| 国产日韩一级二级三级| 欧美四级电影网| 粉嫩av一区二区三区粉嫩| 亚洲一二三级电影| 中文字幕精品三区| 欧美一级午夜免费电影| 99国产精品久| 黄色日韩网站视频| 亚洲电影一级黄| 国产精品美日韩| 欧美va亚洲va| 日本韩国欧美一区| 国产**成人网毛片九色| 日本欧美大码aⅴ在线播放| 国产精品全国免费观看高清| 欧美丰满高潮xxxx喷水动漫| 99精品国产视频| 韩国女主播成人在线| 三级在线观看一区二区| 亚洲人成精品久久久久久| 久久青草国产手机看片福利盒子| 欧美视频在线一区| 91香蕉国产在线观看软件| 国产一区二区三区综合| 亚洲一区二区三区四区在线观看 | 波多野结衣在线一区| 日本aⅴ亚洲精品中文乱码| 亚洲欧美视频在线观看视频| 久久久九九九九| 精品国产乱码久久久久久夜甘婷婷 | 狠狠狠色丁香婷婷综合激情| 亚洲午夜电影在线观看| 亚洲视频香蕉人妖| 国产精品美女一区二区三区| 久久影院电视剧免费观看| 欧美一级久久久久久久大片| 欧美日韩国产小视频在线观看| 91黄视频在线| 一本色道亚洲精品aⅴ| 波多野结衣91| 一本一本久久a久久精品综合麻豆| 成人免费av资源| 成人永久免费视频| 懂色中文一区二区在线播放| 国产乱子伦视频一区二区三区| 精品在线你懂的| 韩国精品主播一区二区在线观看 | 久久国产日韩欧美精品| 91亚洲精华国产精华精华液| 福利一区二区在线观看| 粉嫩av一区二区三区| 成人黄色综合网站| 91蜜桃视频在线| 日本精品视频一区二区| 欧美三级电影在线观看| 欧美日韩国产精品自在自线| 欧美美女喷水视频| 日韩女优毛片在线| 久久久蜜桃精品| 国产精品无人区| 亚洲精品国产一区二区精华液 | 成人亚洲一区二区一| 99久久国产综合精品女不卡| 99re视频精品| 欧美日韩亚洲综合在线| 欧美一区二区精美| 国产嫩草影院久久久久| 亚洲视频1区2区| 图片区小说区区亚洲影院| 婷婷开心久久网| 国产精品99久| jlzzjlzz亚洲日本少妇| 色94色欧美sute亚洲线路一久| 色狠狠桃花综合| 3d成人h动漫网站入口| 久久免费的精品国产v∧| 亚洲欧洲另类国产综合| 夜色激情一区二区| 久久99精品久久久久婷婷| 国产成人av一区| 欧美中文字幕亚洲一区二区va在线 | 色噜噜狠狠色综合欧洲selulu| 欧美日韩黄色影视| 日本成人在线视频网站| 国模娜娜一区二区三区| 国产69精品久久久久777| 在线国产电影不卡| 久久综合九色综合97婷婷女人 | 久久噜噜亚洲综合| 樱桃视频在线观看一区| 蜜桃久久av一区| www..com久久爱| 欧美一区二区日韩一区二区| 国产女人水真多18毛片18精品视频| 亚洲成人免费在线| 成人毛片老司机大片| 欧美一区二区三级| 亚洲精品v日韩精品| 黄色日韩三级电影| 欧美日韩在线一区二区| 国产精品久久久久久久久免费桃花| 丝袜美腿亚洲综合| 91小视频免费看| 久久众筹精品私拍模特| 日韩在线卡一卡二| www.亚洲色图| 精品99一区二区三区| 午夜激情久久久| 在线看日韩精品电影| 国产精品久线观看视频| 国产真实乱偷精品视频免| 欧美色图天堂网| 国产精品久久久久毛片软件| 久久精品av麻豆的观看方式| 欧美亚洲禁片免费| 综合久久国产九一剧情麻豆| 狠狠狠色丁香婷婷综合激情| 91精品国产欧美一区二区成人| 亚洲精品国产精华液| 成人激情视频网站| 国产日韩欧美综合在线| 激情文学综合插| 日韩一区二区麻豆国产| 午夜日韩在线电影| 欧美乱熟臀69xxxxxx| 一区av在线播放| 色激情天天射综合网| 亚洲人成伊人成综合网小说| 成人av资源在线| 国产精品初高中害羞小美女文| 国产麻豆精品在线观看| 久久蜜臀精品av| 国产精品一区二区久久精品爱涩| 欧美精品一区二区三区蜜桃| 美女视频免费一区| 欧美一二三四区在线| 美日韩一级片在线观看| 日韩视频一区二区三区在线播放| 蜜桃在线一区二区三区| 日韩欧美亚洲一区二区| 国内精品在线播放| 欧美极品美女视频| 97se亚洲国产综合自在线不卡| 亚洲三级电影网站| 色老汉一区二区三区| 五月婷婷激情综合| 欧美一区二区三区免费大片| 日韩电影在线观看网站| 精品国产伦一区二区三区观看体验| 狠狠色狠狠色综合系列| 国产人成一区二区三区影院| 国产成人精品网址| 亚洲欧美激情在线| 欧美性猛交xxxx乱大交退制版| 亚洲自拍都市欧美小说| 在线不卡的av| 精品午夜久久福利影院| 日本一区二区三区电影| 91猫先生在线| 午夜电影久久久| 久久综合九色综合欧美98| 不卡影院免费观看| 亚洲三级理论片| 欧美一区二区在线视频| 国产尤物一区二区在线| 自拍偷拍欧美激情| 欧美一区三区二区| 精品一区二区三区的国产在线播放| 国产日韩欧美不卡| 在线国产亚洲欧美| 激情都市一区二区| 亚洲码国产岛国毛片在线|