我在頭文件中定義了一些常量,這些常量包含由flex/bison中寫入的文件解析器解析的某些字符串的最大長度。我想將檢查字符串長度的代碼從c代碼移到我的正則表達式中,以使事情更簡潔一些。在flex規則中使用外部定義的常量
現在我有一個看起來像規則:
[[:alnum:]]+ { yylval.sval = (char*) strdup(yytext); return STRING; }
凡長度檢查發生在野牛規則。
我想修改這一點,以便它檢查比賽比MAX_STR_LEN不再這是在頭叫constants.h定義。如果MAX_STR_LEN等於32,比我想同樣的效果:
[[:alnum:]]{1,32}
反正有沒有做到這一點無需經過預處理的額外步驟運行我的Flex文件?
編輯:
下面的規則將失敗,因爲MAX_STR_LEN不是文字數,它被看作是一個字符串,因此柔性認爲2個行動已經爲一個規則定義。
[[:alnum:]]{1,MAX_STR_LEN} { do_something(); }
另外如果試圖向限定在flex文件的聲明部分的宏比它也失敗本身。
max_len 32 /* Also fails if 32 is replaces with MAX_STR_LEN */
%%
[[:alnum:]]{1,max_len} { do_something(); }
請注意,如果您執行了上述'yyless',則您將重新掃描作爲另一個'STRING'標記的多餘部分,給出掃描儀中的其他功能。這實際上是原始問題的問題,但至少可以說,將ABCDEFG作爲三個單獨的字符串ABC,DEF,G(使用3作爲此示例的最大值)是非常不尋常的。 (這也是低效率的,但是再次,所以呢?) – torek 2012-03-22 19:15:43
這可能是最接近我最初問的。我確實決定採取這種方法,因爲它看起來更靈活一些。 – msikora 2012-03-24 21:41:28