成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++模板”>>”編譯問題與詞法消歧設計

開發(fā) 后端
在編譯理論中,通常將編譯過程抽象為5個主要階段:詞法分析(Lexical Analysis),語法分析(Parsing),語義分析(Semantic Analysis),優(yōu)化(Optimization),代碼生成(Code Generation)。這5個階段類似Unix管道模型,上一個階段的輸出作為下一個階段的輸入。

在編譯理論中,通常將編譯過程抽象為5個主要階段:詞法分析(Lexical Analysis),語法分析(Parsing),語義分析(Semantic Analysis),優(yōu)化(Optimization),代碼生成(Code Generation)。這5個階段類似Unix管道模型,上一個階段的輸出作為下一個階段的輸入。其中,詞法分析是根據(jù)輸入源代碼文本流,分割出詞,識 別類別,產生詞法元素(Token)流,如:

  1. int a = 10; 

​經(jīng)過詞法分析會得到[(Type, "int"), (Identifier, "a"), (AssignOperator, "="), (IntLiteral, 10)],在后續(xù)的語法分析階段,就會根據(jù)這些詞法元素匹配相應的語法規(guī)則。在我學習編譯原理時,教科書中對于詞法分析的介紹主要是基于正則表達式的,言 下之意就是普通語言的詞法規(guī)則是可以通過正則表達式描述的。比如,C語言的變量名規(guī)則是“包含字母、數(shù)字或下劃線,并且以字母或下劃線開頭”,這就可以用 正則表達式[a-zA-Z][a-zA-Z0-9]*表達。但是,在實踐中我發(fā)現(xiàn)不管是主流語言,還是自己設計的DSL都大量存在不能簡單通過正則表達式進行詞法分析的例子。來看C++98的模版例子:

  1. map<int, vector<int>> 

上面這段代碼會被C++98編譯器中報語法錯誤,原因在于它把“>>”識別成了位右移運算符而不是兩個模版右括號,在C++98中必須在兩個括號中間加空格,寫成

  1. map<int, vector<int> > 

除此了C++模版,據(jù)我所知,經(jīng)典的FORTRAN語言的語法規(guī)則更是大量存在詞法歧義。

我認為從本質上講,這類問題的根源在于詞法分析的依據(jù)只是簡單的詞法規(guī)則,并不具備所有的語法信息,而詞法歧義必須提升一層在語法規(guī)則中消除。所 以,在我自己設計一些DSL的時候干脆就把詞法分析和語法分析合二為一了,相當于讓語法分析在字符層次上去進行,而不是經(jīng)典的詞法元素層次上,這就是所謂 的Scannerless Parsing。采用這種方法的例子并不少見,TeX, Wiki, Makefile和Perl 6等語言的語法分析器都屬此類。

Scannerless Parsing方法彌補了詞法規(guī)則無法消歧的問題,但是同時也破壞了詞法和語法分析簡單清晰的管道結構,總體上增加了實現(xiàn)和理解的復雜度。另外,像C++ 這樣大型的語言,如果開始是有詞法分析的,稍微碰到一個歧義就整個轉成Scannerless Parsing未免也顯得太夸張了。這個問題困擾了我很久,直到最近才找到了一個滿意的解決方案。還是以上面”>>”為例,我們知道現(xiàn)在 C++11已經(jīng)允許不加空格了,那么C++11編譯器是如何處理這個詞法歧義的呢?答案是:詞法分析階段既然分析不好”>>”,干脆就不分析 了,直接把”>” “>”交給語法分析器來分析,其他沒有詞法歧義的照舊。當我知道這個方案的時候不由得感嘆:妙!理論上,詞法分析是可以什么也不做的,全部把字符一 一交給語法分析器也沒有問題,所以,干脆讓詞法分析只做有把握的部分,解決不了的交給語法分析器,這樣就既保留了管道結構,又解決了詞法歧義。

下面我們再來看看C++11規(guī)范關于這個問題的定義:

 

14.2 Names of template specializations [temp.names] ###

After name lookup (3.4) finds that a name is a template-name or that an operator-function-id or a literal-operator-id refers to a set of overloaded functions any member of which is a function template if this is followed by a <, the < is always taken as the delimiter of a template-argument-list and never as the less-than operator. When parsing a template-argument-list, the first non-nested > is taken as the ending delimiter rather than a greater-than operator. Similarly, the first non-nested >> is treated as two consecutive but distinct > tokens, the first of which is taken as the end of the template-argument-list and completes the template-id. [ Note: The second > token produced by this replacement rule may terminate an enclosing template-id construct or it may be part of a different construct (e.g. a cast).—end note ]

可見,在C++11中,詞法分析器是把”>>”直接當成兩個”>”傳給了語法分析器,然后在語法分析中如果匹配了template- argument-lis語法,***個”>”符號會被直接認為是模版結束符,而不是大于,也不是位移符號。根據(jù)這個定義,我構造了一個例子:

  1. template<int N> 
  2. class Foo { 
  3. }; 
  4.   
  5. Foo<3>>1> foo; 

這個例子在C++98中是能正確編譯的,”>>”被解釋成了位移運算,但是它反而不能在C++11中編譯了,因為根據(jù)規(guī)范***個”>”被解釋成了模版參數(shù)結束符。如果要在C++11中編譯,需要顯式地加上括號:

  1. Foo<(3>>1)> foo; 

 

原文鏈接:http://coolshell.cn/articles/10449.html

責任編輯:陳四芳 來源: 酷殼網(wǎng)
相關推薦

2010-01-25 13:19:44

C++詞法分析

2010-01-18 09:39:25

C++語言

2010-01-18 10:34:21

C++編譯器

2010-09-16 17:53:12

Java編譯

2023-12-18 11:15:03

2023-12-07 19:19:21

C++模板代碼

2023-12-13 10:51:49

C++函數(shù)模板編程

2010-01-08 16:00:46

C++編譯器

2010-01-21 09:11:38

C++編譯器

2010-01-11 15:47:37

C++編譯

2023-11-02 09:59:53

C++設計模式

2024-11-27 08:26:00

C++模板靜態(tài)

2013-06-24 15:32:00

c++GCC

2010-02-03 17:42:33

C++模板參數(shù)

2023-12-06 13:48:00

C++代碼

2010-02-06 16:59:19

C++ kmp算法模板

2010-01-26 13:55:07

C++標準模板庫

2010-01-25 10:54:18

C++設計

2010-10-20 13:43:37

C++編譯器

2022-09-22 10:22:36

C++編程語言代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区免费观看 | 国产精品亚洲二区 | 黄网免费看 | 久久这里只有精品首页 | 99久久精品免费 | 丝袜 亚洲 另类 欧美 综合 | 九九九视频在线观看 | 欧美激情精品久久久久 | 欧美h版 | 色婷婷久久久亚洲一区二区三区 | 天天成人综合网 | 免费小视频在线观看 | 欧洲av在线| 91久久精 | 免费午夜视频 | 久久婷婷香蕉热狠狠综合 | 三级特黄特色视频 | 国产精品视频999 | 久久久久久av | 国产清纯白嫩初高生在线播放视频 | 久在线视频 | 成人免费一区二区三区牛牛 | 欧美精品在线播放 | 97av在线| 成人伊人 | 国产一区二区三区久久久久久久久 | 福利视频大全 | 成年人在线播放 | 亚洲精品永久免费 | 亚洲精品女人久久久 | 国产精品日韩一区二区 | 中文字幕精品视频在线观看 | 欧美一级免费 | 亚洲精品1| 国产精品视频一区二区三区 | 天天综合久久 | 国产视频二区 | 亚洲国产精品suv | 亚洲人va欧美va人人爽 | 国产成人综合一区二区三区 | 日韩一区二区免费视频 |