我正在爲C語言製作詞彙分析器,這是一種功耗較低的版本。是否可以在同一個C/C++程序中使用兩個或多個不同的yylex()函數?
我想要在不同的時間處理不同類型的正則表達式,例如第一次來自源程序的輸入字符流,然後第二次處理第一次處理後生成的程序的中間表示形式。
那麼有可能使用FLEX創建2個或更多的yylex()
函數,並將它用於相同的C/C++程序中,即詞法分析器?
我正在爲C語言製作詞彙分析器,這是一種功耗較低的版本。是否可以在同一個C/C++程序中使用兩個或多個不同的yylex()函數?
我想要在不同的時間處理不同類型的正則表達式,例如第一次來自源程序的輸入字符流,然後第二次處理第一次處理後生成的程序的中間表示形式。
那麼有可能使用FLEX創建2個或更多的yylex()
函數,並將它用於相同的C/C++程序中,即詞法分析器?
flex
有similar parameter:
'-PPREFIX,前綴=前綴%選擇前綴= 「前綴」' 更改所有全局變量可見使用柔性的 默認 'YY' 前綴和 函數名稱改爲'PREFIX'。例如,'--prefix = foo' 將yytext的名稱更改爲footext。它還將默認輸出文件 的名稱從lex.yy.c更改爲lex.foo.c.
因此,您可以重命名第二個函數及其變量。 不幸的是POSIX lex沒有這樣的參數。
非常感謝。 :) – PalashV
可以使用%prefix聲明中yylex
的yy
(和其他各種全球性的名稱)更改爲不同的東西,它可以讓你在同一個項目中多臺掃描儀。您可能還需要使用-o
選項來設置生成的文件的名稱;否則,構建過程變得很難看。
但它們將是完全獨立的掃描儀,每個掃描儀都有自己的輸入流。這可能不是你想要的。
如果您希望掃描儀的詞彙定義可以更改爲另一組,您需要使用start conditions。這樣可以讓您在不同的環境下更改掃描儀行爲,並且可以分享常見詞彙功能。
非常感謝。 :) – PalashV
你確定要用flex/bison來做這個,而不是[Boost.Spirit](http://www.boost.org/doc/libs/release/libs/spirit/doc/html/index。 HTML)? – DevSolar
@DevSolar是的。這是一個學術課程項目,必須使用flex/bison。 – PalashV
是的,有時候學術慣性是無法幫助的。 ;-) – DevSolar