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

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

?? tply.tex

?? 編譯原理基礎
?? TEX
?? 第 1 頁 / 共 5 頁
字號:
expr : expr '+' expr
     | expr '*' expr
     | '(' expr ')'
     | NUM
     ;
\end{verbatim}\end{quote}

Without the precedence definitions, this is an ambigious grammar causing
a number of shift/reduce conflicts. The precedence definitions are used
to correctly resolve these conflicts (conflicts resolved using precedence
will not be reported by TP Yacc).

Each precedence definition introduces a new precedence level (lowest
precedence first) and specifies whether the corresponding operators
should be left-, right- or nonassociative (nonassociative operators
cannot be combined at all; example: relational operators in Pascal).

TP Yacc uses precedence information to resolve shift/reduce conflicts as
follows. Precedences are associated with each terminal occuring in a
precedence definition. Furthermore, each grammar rule is given the
precedence of its rightmost terminal (this default choice can be
overwritten using a \verb"%prec" tag; see below). To resolve a shift/reduce
conflict using precedence, both the symbol and the rule involved must
have been assigned precedences. TP Yacc then chooses the parse action
as follows:

\begin{itemize}
   \item
      If the symbol has higher precedence than the rule: shift.
   \item
      If the rule has higher precedence than the symbol: reduce.
   \item
      If symbol and rule have the same precedence, the associativity of the
      symbol determines the parse action: if the symbol is left-associative:
      reduce; if the symbol is right-associative: shift; if the symbol is
      non-associative: error.
\end{itemize}

To give you an idea of how this works, let us consider our ambigious
arithmetic expression grammar (without precedences):

\begin{quote}\begin{verbatim}
%token NUM
%%
expr : expr '+' expr
     | expr '*' expr
     | '(' expr ')'
     | NUM
     ;
\end{verbatim}\end{quote}

This grammar generates four shift/reduce conflicts. The description
of state 8 reads as follows:

\begin{quote}\begin{verbatim}
state 8:

        *** conflicts:

        shift 4, reduce 1 on '*'
        shift 5, reduce 1 on '+'

        expr : expr '+' expr _  (1)
        expr : expr _ '+' expr
        expr : expr _ '*' expr

        '*'     shift 4
        '+'     shift 5
        $end    reduce 1
        ')'     reduce 1
        .       error
\end{verbatim}\end{quote}

In this state, we have successfully parsed a \verb"+" expression (rule 1).
When the next symbol is \verb"+" or \verb"*", we have the choice between the
reduction and shifting the symbol. Using the default shift/reduce
disambiguating rule, TP Yacc has resolved these conflicts in favour of shift.

Now let us assume the above precedence definition:
\begin{quote}\begin{verbatim}
   %left '+'
   %left '*'
\end{verbatim}\end{quote}
which gives \verb"*" higher precedence than \verb"+" and makes both operators
left-associative. The rightmost terminal in rule 1 is \verb"+". Hence, given
these precedence definitions, the first conflict will be resolved in favour
of shift (\verb"*" has higher precedence than \verb"+"), while the second one
is resolved in favour of reduce (\verb"+" is left-associative).

Similar conflicts arise in state 7:

\begin{quote}\begin{verbatim}
state 7:

        *** conflicts:

        shift 4, reduce 2 on '*'
        shift 5, reduce 2 on '+'

        expr : expr '*' expr _  (2)
        expr : expr _ '+' expr
        expr : expr _ '*' expr

        '*'     shift 4
        '+'     shift 5
        $end    reduce 2
        ')'     reduce 2
        .       error
\end{verbatim}\end{quote}

Here, we have successfully parsed a \verb"*" expression which may be followed
by another \verb"+" or \verb"*" operator. Since \verb"*" is left-associative
and has higher precedence than \verb"+", both conflicts will be resolved in
favour of reduce.

Of course, you can also have different operators on the same precedence
level. For instance, consider the following extended version of the
arithmetic expression grammar:

\begin{quote}\begin{verbatim}
%token NUM
%left '+' '-'
%left '*' '/'
%%
expr    : expr '+' expr
        | expr '-' expr
        | expr '*' expr
        | expr '/' expr
        | '(' expr ')'
        | NUM
        ;
\end{verbatim}\end{quote}

This puts all ``addition'' operators on the first and all ``multiplication''
operators on the second precedence level. All operators are left-associative;
for instance, \verb"5+3-2" will be parsed as \verb"(5+3)-2".

By default, TP Yacc assigns each rule the precedence of its rightmost
terminal. This is a sensible decision in most cases. Occasionally, it
may be necessary to overwrite this default choice and explicitly assign
a precedence to a rule. This can be done by putting a precedence tag
of the form
\begin{quote}\begin{verbatim}
   %prec symbol
\end{verbatim}\end{quote}
at the end of the corresponding rule which gives the rule the precedence
of the specified symbol. For instance, to extend the expression grammar
with a unary minus operator, giving it highest precedence, you may write:

\begin{quote}\begin{verbatim}
%token NUM
%left '+' '-'
%left '*' '/'
%right UMINUS
%%
expr    : expr '+' expr
        | expr '-' expr
        | expr '*' expr
        | expr '/' expr
        | '-' expr      %prec UMINUS
        | '(' expr ')'
        | NUM
        ;
\end{verbatim}\end{quote}

Note the use of the \verb"UMINUS" token which is not an actual input symbol
but whose sole purpose it is to give unary minus its proper precedence. If
we omitted the precedence tag, both unary and binary minus would have the
same precedence because they are represented by the same input symbol.

\subsection*{Error Handling}

Syntactic error handling is a difficult area in the design of user-friendly
parsers. Usually, you will not like to have the parser give up upon the
first occurrence of an errorneous input symbol. Instead, the parser should
recover from a syntax error, that is, it should try to find a place in the
input where it can resume the parse.

TP Yacc provides a general mechanism to implement parsers with error
recovery. A special predefined \verb"error" token may be used in grammar rules
to indicate positions where syntax errors might occur. When the parser runs
into an error action (i.e., reads an errorneous input symbol) it prints out
an error message and starts error recovery by popping its stack until it
uncovers a state in which there is a shift action on the \verb"error" token.
If there is no such state, the parser terminates with return value 1,
indicating an unrecoverable syntax error. If there is such a state, the
parser takes the shift on the \verb"error" token (pretending it has seen
an imaginary \verb"error" token in the input), and resumes parsing in a
special ``error mode.''

While in error mode, the parser quietly skips symbols until it can again
perform a legal shift action. To prevent a cascade of error messages, the
parser returns to its normal mode of operation only after it has seen
and shifted three legal input symbols. Any additional error found after
the first shifted symbol restarts error recovery, but no error message
is printed. The TP Yacc library routine \verb"yyerrok" may be used to reset
the parser to its normal mode of operation explicitly.

For a simple example, consider the rule
\begin{quote}\begin{verbatim}
   stmt : error ';' { yyerrok; }
\end{verbatim}\end{quote}
and assume a syntax error occurs while a statement (nonterminal \verb"stmt")
is parsed. The parser prints an error message, then pops its stack until it
can shift the token \verb"error" of the error rule. Proceeding in error mode,
it will skip symbols until it finds a semicolon, then reduces by the error
rule. The call to \verb"yyerrok" tells the parser that we have recovered from
the error and that it should proceed with the normal parse. This kind of
``panic mode'' error recovery scheme works well when statements are always
terminated with a semicolon. The parser simply skips the ``bad'' statement
and then resumes the parse.

Implementing a good error recovery scheme can be a difficult task; see
Aho/Sethi/Ullman (1986) for a more comprehensive treatment of this topic.
Schreiner and Friedman have developed a systematic technique to implement
error recovery with Yacc which I found quite useful (I used it myself
to implement error recovery in the TP Yacc parser); see Schreiner/Friedman
(1985).

\subsection*{Yacc Library}

The TP Yacc library (\verb"YaccLib") unit provides some global declarations
used by the parser routine \verb"yyparse", and some variables and utility
routines which may be used to control the actions of the parser and to
implement error recovery. See the file \verb"YACCLIB.PAS" for a description
of these variables and routines.

You can also modify the Yacc library unit (and/or the code template in the
\verb"YYPARSE.COD" file) to customize TP Yacc to your target applications.

\subsection*{Other Features}

TP Yacc supports all additional language elements entitled as ``Old Features
Supported But not Encouraged'' in the UNIX manual, which are provided for
backward compatibility with older versions of (UNIX) Yacc:

\begin{itemize}
   \item
      literals delimited by double quotes.
   \item
      multiple-character literals. Note that these are not treated as
      character sequences but represent single tokens which are given a
      symbolic integer code just like any other token identifier. However,
      they will not be declared in the output file, so you have to make sure
      yourself that the lexical analyzer returns the correct codes for these
      symbols. E.g., you might explicitly assign token numbers by using a
      definition like
      \begin{quote}\begin{verbatim}
   %token ':=' 257
      \end{verbatim}\end{quote}
      at the beginning of the Yacc grammar.
   \item
      \verb"\" may be used instead of \verb"%", i.e. \verb"\\" means
      \verb"%%", \verb"\left" is the same as \verb"%left", etc.
   \item
      other synonyms:
      \begin{itemize}
         \item \verb"%<"                    for \verb"%left"
         \item \verb"%>"                    for \verb"%right"
         \item \verb"%binary" or \verb"%2"  for \verb"%nonassoc"
         \item \verb"%term" or \verb"%0"    for \verb"%token"
         \item \verb"%="                    for \verb"%prec"
      \end{itemize}
   \item
      actions may also be written as \verb"= { ... }" or
      \verb"= single-statement;"
   \item
      Turbo Pascal declarations (\verb"%{ ... %}") may be put at the
      beginning of the rules section. They will be treated as local
      declarations of the actions routine.
\end{itemize}

\subsection*{Implementation Restrictions}

As with TP Lex, internal table sizes and the main memory available limit the
complexity of source grammars that TP Yacc can handle. There is currently no
possibility to change internal table sizes (apart from modifying the sources
of TP Yacc itself) or to make use of extended memory. However, the maximum
table sizes provided by TP Yacc are large enough to handle quite complex
grammars (such as the Pascal grammar in the TP Yacc distribution). The
current limits are 600 s (states), 2400 i (LR0 kernel items), 2400 t (shift
and goto transitions) and 1200 r (reductions).

The default stack size of the generated parsers is \verb"yymaxdepth = 1024",
as declared in the TP Yacc library unit. This should be sufficient for any
average application, but you can change the stack size by including a
corresponding declaration in the definitions part of the Yacc grammar
(or change the value in the \verb"YaccLib" unit). Note that right-recursive
grammar rules may increase stack space requirements, so it is a good
idea to use left-recursive rules wherever possible.

\subsection*{Differences from UNIX Yacc}

Major differences between TP Yacc and UNIX Yacc are listed below.

\begin{itemize}
   \item
      TP Yacc produces output code for Turbo Pascal, rather than for C.
   \item
      TP Yacc does not support \verb"%union" definitions. Instead, a value
      type is declared by specifying the type identifier itself as the tag of
      a \verb"%token" or \verb"%type" definition. TP Yacc will automatically
      generate an appropriate variant record type (\verb"YYSType") which is
      capable of holding values of any of the types used in \verb"%token" and
      \verb"%type".
    
      Type checking is very strict. If you use type definitions, then
      any symbol referred to in an action must have a type introduced
      in a type definition. Either the symbol must have been assigned a
      type in the definitions section, or the \verb"$<type-identifier>"
      notation must be used. The syntax of the \verb"%type" definition has
      been changed slightly to allow definitions of the form
      \begin{quote}\begin{verbatim}
   %type <type-identifier>
      \end{verbatim}\end{quote}
      (omitting the nonterminals) which may be used to declare types which
      are not assigned to any gra

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜桃av一区二区| 亚洲自拍与偷拍| 成人精品视频一区二区三区| 久久久综合激的五月天| 国产在线精品免费| 国产精品国产三级国产普通话99| 99精品欧美一区| 亚洲自拍偷拍九九九| 欧美日本高清视频在线观看| 喷白浆一区二区| 久久久久国产精品人| 91在线免费看| 日本va欧美va精品| 欧美激情自拍偷拍| 欧美亚洲愉拍一区二区| 蜜臀av一区二区| 国产精品美女一区二区三区| 欧美在线免费观看亚洲| 免费观看在线综合色| 国产精品初高中害羞小美女文| 在线亚洲+欧美+日本专区| 奇米影视在线99精品| 国产精品视频yy9299一区| 欧美综合在线视频| 激情六月婷婷综合| 亚洲人成网站影音先锋播放| 91麻豆精品国产91久久久资源速度 | 欧美剧情片在线观看| 天堂在线一区二区| 久久久不卡网国产精品二区| 色综合久久88色综合天天6| 午夜在线成人av| 国产亚洲一区字幕| 欧美视频一区二区| 国产精品影视在线观看| 亚洲综合久久久| 久久久亚洲精品石原莉奈| 91久久人澡人人添人人爽欧美| 日本成人在线视频网站| 亚洲欧洲www| 日韩欧美精品三级| 色悠久久久久综合欧美99| 美女性感视频久久| 亚洲综合免费观看高清完整版| 精品剧情在线观看| 欧美日韩一二三区| av电影在线不卡| 国产一区二区主播在线| 亚洲mv在线观看| ...中文天堂在线一区| 精品美女被调教视频大全网站| 91福利在线导航| 99视频精品在线| 国产精品一区专区| 看电影不卡的网站| 日韩精品一级二级| 亚洲国产sm捆绑调教视频| 中文字幕字幕中文在线中不卡视频| 2欧美一区二区三区在线观看视频| 欧美日韩综合一区| 色婷婷av一区| 91视频你懂的| 99免费精品视频| www.综合网.com| 不卡在线观看av| 成年人国产精品| 成a人片亚洲日本久久| 成人国产一区二区三区精品| 国内精品免费**视频| 久久精品国产99| 狠狠久久亚洲欧美| 黄色日韩三级电影| 国产经典欧美精品| 国产91精品入口| 成人激情小说乱人伦| 成人深夜视频在线观看| 成人免费观看视频| 高清在线观看日韩| www.日韩精品| 91黄视频在线| 欧美日韩国产系列| 91精品一区二区三区久久久久久| 欧美浪妇xxxx高跟鞋交| 91精品在线麻豆| 26uuu成人网一区二区三区| 2020国产精品久久精品美国| 久久精品这里都是精品| 国产精品久久久久久久久久久免费看 | 久久网这里都是精品| 亚洲精品一区二区精华| 国产日韩在线不卡| 亚洲欧洲三级电影| 亚洲已满18点击进入久久| 天堂一区二区在线免费观看| 免费看日韩a级影片| 国产一区二区在线视频| 成人激情动漫在线观看| 91亚洲午夜精品久久久久久| 欧美在线观看视频一区二区| 91.com视频| 久久精品亚洲麻豆av一区二区| 国产精品成人在线观看| 丝袜国产日韩另类美女| 国产精品一区二区在线播放| 99国产精品99久久久久久| 欧美亚日韩国产aⅴ精品中极品| 91精品国产综合久久精品 | 久久精品亚洲精品国产欧美kt∨ | 久久精品亚洲国产奇米99| 亚洲品质自拍视频| 秋霞成人午夜伦在线观看| 国产成人精品影视| 欧美中文字幕一区| 精品日韩在线一区| 亚洲欧洲制服丝袜| 久久狠狠亚洲综合| 91日韩一区二区三区| 日韩欧美一级在线播放| 亚洲免费高清视频在线| 免费观看久久久4p| 久久精品一级爱片| 日本va欧美va精品| 国产成人午夜片在线观看高清观看 | 亚洲精品在线观看视频| 亚洲日本一区二区| 久久精品国产99| 在线观看中文字幕不卡| 国产网站一区二区| 日韩电影免费一区| 99久久久精品免费观看国产蜜| 日韩午夜激情视频| 亚洲婷婷综合久久一本伊一区 | 国产成人午夜电影网| 欧美日韩视频在线第一区| 欧美激情一区二区三区不卡| 午夜精品久久久久久久蜜桃app| 成人深夜在线观看| 精品国产污网站| 视频一区视频二区在线观看| 色香蕉久久蜜桃| 国产蜜臀av在线一区二区三区| 欧美aaaaaa午夜精品| 欧美三级在线播放| 最好看的中文字幕久久| 国产成人精品三级| 欧美成人r级一区二区三区| 成人久久视频在线观看| 日韩一级二级三级精品视频| 亚洲美女免费视频| 成人免费视频caoporn| www一区二区| 美女视频一区二区三区| 欧美日韩五月天| 亚洲第一二三四区| 在线观看91精品国产入口| 国产精品久线在线观看| 国产福利一区在线| 2023国产一二三区日本精品2022| 日本免费新一区视频| 欧美精品一卡二卡| 性感美女极品91精品| 日本道色综合久久| 亚洲精品免费一二三区| 99re亚洲国产精品| 亚洲欧美一区二区三区孕妇| 色综合一区二区三区| ...xxx性欧美| 在线视频你懂得一区| 一区二区三区在线影院| 在线观看一区日韩| 亚洲18女电影在线观看| 91麻豆精品国产无毒不卡在线观看 | 91在线无精精品入口| 99v久久综合狠狠综合久久| 中文字幕一区二区5566日韩| 国产91精品久久久久久久网曝门| 欧美不卡视频一区| 国产一区二区免费在线| 亚洲国产精品成人综合色在线婷婷| 国产一区二区剧情av在线| 中文字幕欧美区| 在线视频国内自拍亚洲视频| 亚洲超丰满肉感bbw| 日韩欧美资源站| 国产成都精品91一区二区三| 中文字幕欧美一| 精品污污网站免费看| 美国三级日本三级久久99 | 国产精品一二三四五| 中文无字幕一区二区三区| 成人av电影观看| 亚洲成a人片在线不卡一二三区| 911精品国产一区二区在线| 激情六月婷婷综合| 18涩涩午夜精品.www| 欧美三级韩国三级日本一级| 欧美96一区二区免费视频| 国产日韩精品一区二区浪潮av| 一本久久a久久免费精品不卡| aaa亚洲精品一二三区|