回覆列表
  • 1 # 使用者725448330983

    首先解析語法之前,編譯器會先對原始碼進行預處理以讓程式碼更適合被語法解析,這部分的操作就包括合併多個多次出現的空白符(比如空格和對齊符都會被當做空白符)

    處理空白符包含多種情況(下面用\t表示空白符)

    1.連續出現的空白符,比如下面這種

    int \t\t\t\t\t a;在兩個token之間出現的多個空白符,在解析後這些空白符會被直接合並,程式碼變成

    int a;

    2.出現在表示式開頭和結尾的空白符,例如

    int a;

    \t\t\t\t\t int b; \t\t\t\t\t int c;

    3.出現在分隔符之間的空白符,比如

    4.出現在Container中的空格符

    #include <../inc data/abc>出現的空白符

    5.和回車換行合併的空白符,例如

    \t\t\t\t\t\r\n

    \t\r\n

    \r\n

    上面的幾個步驟可以分多次完成,比如第一次掃描原始碼先合併多次出現空白符,第二次再處理出現在表示式開頭和結尾的空白符

    可以參考我PainterEngine專案下的一個StoryScript的編譯器.其中PX_Lexer是這個語言的詞法分析機,它會預先處理原始碼,包括對不同型別的詞進行預處理以便於之後的語法分析在此之後原始碼會交給PX_Script_Interpreter,它是指令碼語言的語法分析機,用於將指令碼語言轉換為中間語言,這裡可以找到語法分析的詳細過程.之後交給PX_Script_ASMCompiler是彙編器,用於將中間語言轉換為指令流,實際上它也包括了一套完整的語法和詞法分析,相對於指令碼語法分析會簡單點.

    matrixcascade/PainterEngine

  • 中秋節和大豐收的關聯?
  • 你想活成自己母親(父親)的樣子嗎?