2012-12-09 74 views
1

我是新來的野牛,我有一些基本的問題,如果你能幫助我與他們同在基本問題解析

  1. 哪一個是正確的下列行爲:

    %left ’*’ ’/’ 
    

    %left '*' '/' 
    

    這意味着,而不是讓我用它的令牌解析器文件來定義它

  2. 我可以定義這樣的規則:

    EXP -> EXP "and" EXP 
    

    ,而不是

    EXP -> EXP AND EXP //AND here is a token 
    
  3. 如果我有LEX和BISON文件建立一個解析器應該包括其他的,如果 我已經使用了一個共同的頭文件,其中一個應該定義文件?

  4. 如果BISON算法找到匹配根據發生的事情首先,它使得減少則它的匹配或規則中定義的操作首先它之後的動作,使減少對堆棧的規則呢?

回答

2
  1. 其強硬地告訴你問因您的格式,但認爲答案是否定的。 %left只是定義了一個令牌(就像%token一樣),併爲該令牌設置了優先級。您仍然必須通過在詞法分析器中識別該標記並返回相應的標記值來「獲取」該標記。

  2. 雖然你可以使用"and",但你不想因爲它幾乎不可能正確。它更好地使用ANDand(不含引號)。區別在於使用引號創建的token不會在.tab.h文件中作爲#define輸出,因此在詞法分析器中沒有簡單的方法來生成該令牌。

  3. 有很多方法可以做到這一點。最簡單的方法是既不包含其他文件,也讓lex文件包含由bison的-d標記生成的頭文件 - 這是大多數示例所做的。也可以將lex.yy.c文件直接包含在.y文件的第3部分中,或者將.tab.c包含在.l文件的頂部(但不能同時包含!),在這種情況下,您只能編譯一個文件。

  4. 它首先執行規則的動作(因此RHS上的項的值在動作執行時可用),然後執行棧減少,用動作放入的int值替換RHS項$$

+1

現在我可以更清楚一些了,但我認爲第一季度的問題是使用ASCII單引號U + 0027 APOSTROPHE(''')與Unicode(UTF-8) )U + 2019右單引號(''') - 或U_2018左單引號(''')。答案是,我相信Lex/Flex和Bison都希望使用撇號而不是單引號。 –

+0

感謝您的幫助,但是如果我使用另外兩個文件.c和.h來爲.y文件中的操作定義外部函數,那麼在.h文件中要爲它們包括哪些內容,在.h中聲明函數和實現在.c中 – flashdisk

1

我有點克里斯不同意2點這是更好地使用"and",因爲這樣在錯誤消息解析器將報告東西約"and"而不是約TOK_ANDt_AND這肯定是沒有意義給用戶。

而且這不是很難得到它的權利:只要你插入

%token TOK_AND "and" 

的地方,你可以在語法文件中使用任何"and"TOK_AND。但是,恕我直言,前者更清晰。