對於openmp/c的詞法掃瞄器需要處理c語言單詞和openmp/c制導指令,編譯器的詞義分析的關鍵是*.i檔案(字尾為i的檔案,是字母i,不是數字1)。*.i檔案經過flex工具(lex的gnu版本為flex)產生出*.yy.c檔案,經過gcc編譯後可以生成乙個可執行檔案進行分析。
openmp/c下的這個*.i檔案與普通c語言的詞義分析不同的是需要區別出openmp和c的掃瞄區域,其主要分成三個部分:
(1)全域性宣告段。全域性宣告段主要是分為兩個部分,乙個部分是開頭的6個標記:
d:[0-9] 數字
l:[a-za-z_] 字元
h:[a-fa-f0-9] 十六進製制數
e:[ee][+-]?+ 指數形式的浮點數
fs:(f|f|ll) 浮點型別
is:(u|u|l|l) 整形型別
另乙個是「%」之間的c語言宣告,其中包括乙個標頭檔案,巨集定義,變數的定義,初始規則。
這裡的初始規則可以通過函式實現,將檔案掃瞄位置進行初始化,變數start_token用於記錄詞法分析得初始規則,最後用%%表示c的宣告結束,lex檔案的第一段宣告部分結束,第二段的開始
(2)模式匹配規則
發現有#pragma omp或#pragma omp threadprivate就說明有openmp編譯制導指令,此時將on_omp_line和_has_omp置為1,並返回omp符號。這些符號都是在標頭檔案「parser.h」中,第一段已經有過宣告。on_omp_line就是用來區別openmp與c的公共符號,其它一些匹配還有識別符號,型別說明符,操作符,變數等就返回相應的符號編號
ps:當openmp的編譯制導行的結尾處出現換行符,那麼on_omp_line將被置為0,so,編譯指令不能跨行。
最後,再以%%結束第二段,開始第三段
(3)自定義函式段(個人這麼命名)
這段主要就是實現一些函式,比如sharp()忽略「#」開頭的行,gobbleline()忽略「//......」注釋行等等
ps:如果編譯的時候不加上-ll,還需要加入main函式和yywrap(),main函式中呼叫yylex()進行詞義分析
pps:對於yywrap函式,實現形式如下:
int yywrap()
一般在函式的末尾呼叫,返回1停止解析。
基於統計的詞向量
glove 的訓練過程 實質上還是監督學習 雖然 glove 不需要人工標註為無監督學習,但實質還是有 label 就是 log xij 向量 和 為學習引數,本質上與監督學習的訓練方法一樣,採用了 adagrad 的梯度下降演算法,對矩陣 x 中的所有非零元素進行隨機取樣,學習曲率 learnin...
Lex與Yacc的結合
lex與yacc的結合 首先,我就不介紹lex的語法規則了,因為在一些書上這些是重點介紹的內容,我先把lex的源程式寫在下面,然後講解。number 0 9 其中 define number 257 define plus 258 define sub 259 define chen 260 def...
基於TextRank的關鍵詞提取演算法
pagerank是用來計算網頁重要性的,將每乙個網頁看作乙個節點,將網頁之間的鏈結看作是節點之間的有向邊,網頁的重要性取決於鏈結到它的網頁數量以及這些網頁的重要性。衡量網頁重要性的公式說明如下 什麼是共現關係呢?將文字進行分詞,去除停用詞或詞性篩選等之後,設定視窗長度為k,即最多只能出現k個詞,進行...