2013-11-21 106 views
0

我正在使用LEX和YACC。我有一個關於如何定義標記,我的意思是我有分享一些字符兩個正則表達式問題,請參見下面的例子:LEX?共享正則表達式

SHARED   "+"|"-"|"/"|"="|"%"|"?"|"!"|"."|"$"|"_"|"~"|"&"|"^"|"<"|">"|"("|")"|"," 
REXP_1   {SHARED}|[a-zA-Z]|[ \t]+|[\\][\\\"] 
REXP_2   {SHARED}|[a-zA-Z]|[ \t]+|"*" 

現在,我的觀點是如何確定何時從共享正則表達式的字符對應當我在.lex文件的第三部分中定義標記時,將其添加到REXP_1或REXP_2。

我覺得我誤解了一些東西,我想我寫正則表達式的方式是錯誤的,但我沒有找到一種更好的方法。你能給我一些提示嗎?

如果有人能指導我一些標準來確定何時定義一個標記(file.lex)或何時在語法(file.y)中定義一個符號,我將不勝感激。對於某些符號,很容易弄清楚它是一個符號還是一個語法符號,但對於其他符號,我覺得很難定義它們放在哪裏。

通過我與this grammar

+0

難道你不能在這裏使用C預處理器嗎?只需'#define SHARED'即可,然後將其與字符串粘貼工具一起使用。 – tripleee

+0

我對LEX或YACC不熟悉,但大概'SHARED'可以用'[/=%?!.$_〜&^ <>(),+ - ]'來代替,那麼它不是那麼大,所以你可以只是將其包含在每個正則表達式中。 – OGHaza

+0

感謝您的幫助。我所做的是將一個類似於@OGHaza的regext定義爲一個標記,然後將其用在語法本身(file.y)中。我要去測試它。 – pafede2

回答

1

Answered in a question edit)工作

的OP寫的方式:

萬一有人覺得很有意思,我要寫出我的經驗教訓。我認爲我學到的最重要的一課是,常識是一個很好的工具,可以確定.lex文件中的實習記號是什麼,以及與.y文件共享的合適記號是什麼。

由於術語「常識」可能有點曖昧我張貼下面的例子:

ALPHA_NUMERIC [a-bA-B0-9] 
    SQ_CHAR   {SHARED}|{ALPHA_NUMERIC} 
    SINGLE_QUOTED {SINGLE_QUOTE}{SQ_CHAR}{SQ_CHAR}*{SINGLE_QUOTE} 

其中ALPHA_NUMERIC是一個很好的實習令牌(file.lex),但是是一個糟糕的令牌語法文件共享而SINGLE_QUOTED可能是與文法共享的好兆頭(file.y)。我寫了'可能',因爲它非常依賴於我們正在處理的特定語法,在我的具體情況下,這是與YACC文件共享的一個好兆頭。

我所做的是將一個類似於@OGHaza的正則表達式定義爲file.lex,然後在語法本身中使用它(file.y)。

相關問題