2011-04-12 120 views
4

我必須在C++中使用解析器和編寫器,我試圖實現函數,但我不明白什麼是令牌。我的功能/操作的一個是檢查,看看是否有更多的標記生產什麼是令牌,關於解析

布爾分析器:: hasMoreTokens()

究竟如何我去了解這一點,請大家幫忙

SO!

我打開一個帶有文本的文本文件,所有的單詞都是小寫的。我如何去查看它是否有更多的快餐?

這是我

bool Parser::hasMoreTokens() { 

while(source.peek()!=NULL){ 
    return true; 
} 
    return false; 
} 
+1

請不要指望堆棧溢出來寫你的代碼你。特別是如果它是作業(是嗎?聽起來像是這樣)。告訴我們你試過的東西。如果你根本不知道該怎麼做,並且(如我猜測的)這是家庭作業,那麼你應該問問你的老師/教授/助教,他們可以(例如)指出你的筆記的相關位或教科書。 – 2011-04-12 17:38:22

回答

3

令牌是詞法分析的輸出和輸入到解析。通常他們的東西像

  • 數字
  • 變量名
  • 括號
  • 算術運算符
  • 語句結束

也就是說,大致來說,最大的事情,可以清楚地識別通過一次只查看其輸入一個字符的代碼。

一個註釋,如果它讓你感到困惑,你應該隨時忽略它:詞法分析和解析之間的界限有點​​模糊。例如:

  1. 一些編程語言有看,說,像2+3i3.2e8-17e6i複數文字。如果你正在解析這樣的語言,你可以讓詞法分析器吞噬一個複雜的數字,並將它變成一個令牌;或者你可以有一個更簡單的詞法分析器和一個更復雜的解析器,並使(例如)3.2e8,-,17e6i成爲單獨的標記;那麼解析器的工作(或者甚至是代碼生成器)就會注意到它所得到的實際上是一個單一的文字。

  2. 在某些編程語言中,詞法分析器可能無法判斷給定標記是變量名還是類型名。 (例如,這發生在C語言中)。但語言的語法可能會區分這兩種語言,因此您希望「變量foo」和「類型名稱foo」是不同的記號。 (這也發生在C中)。在這種情況下,可能需要將某些信息從解析器反饋回詞法分析器,以便它可以在每種情況下生成正確類型的標記。

因此, 「什麼究竟是一個令牌?」可能並不總是有一個完美定義的答案。

0

令牌通常是類似於在sponken語言文字。在C++中,(int,float,5.523,const)將是標記。是構成語義元素的文本的最小單位。

1

將大單元(長字符串)分成一組子單元(較小字符串)時,每個子單元(較小字符串)都稱爲「標記」。如果沒有更多的子單元,那麼你就完成了解析。

How do I tokenize a string in C++?

0

一個令牌是具有意義的編程語言的最小單位。括號(,名稱foo,整數123,都是令牌。將文本減少爲一系列令牌通常是解析它的第一步。

0

令牌是在一個語法的終端,一個或多個符號(S)由該序列本身定義的序列,即,它不從語法定義的任何其它的生產派生。

0

令牌是你希望它是什麼。傳統(和 很好的理由),語言規範打破了分析到 兩部分:第一部分打破了輸入流中令牌, 和第二解析的令牌。 (理論上,我認爲你 可以寫在任何語法只在一個單一的水平,而不使用 令牌—或同樣的事情,使用個人 字符作爲標記我不希望看到 的結果。語言如C++,不過),但 定義的標記是什麼完全取決於語言你 解析:大多數語言中,例如,把白色空間 分離器(但不是Fortran語言);大多數語言將使用標點符號預定義 一套標點符號/運營商,以及 不允許這些符號字符(但不包括COBOL,其中 「ABC-DEF」將是一個符號)。在某些情況下(包括C++預處理器中的 ),什麼是令牌取決於上下文,因此您可能需要解析器的一些反饋。 (但願不是; 之類的事情是非常有經驗的程序員。)

有一兩件事是肯定可能(除非每個字符是一個令牌): 你必須預讀數據流中。您通常不能通過查看單個 字符來判斷是否有更多的令牌。事實上,我一般認爲它很有用,因爲標記器一次只能讀取整個標記,並保留它直到 解析器需要它。像hasMoreTokens這樣的功能實際上是 掃描一個完整的標記。

(雖然我在這,如果sourceistreamistream::peek不返回一個指針,而是一個int