基於lex的OpenMP C的詞義分析

2021-06-27 20:09:46 字數 1147 閱讀 3152

對於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個詞,進行...