input
輸入一程式,結束符用」#」;
output
輸出單詞數對:《類號,序號》。 輸出識別符號表,用空格分隔; 輸出無符號整數表,用空格分隔;
輸入樣例
main()
#輸出樣例
<1,1><3,0><3,1><3,2><1,0><4,0><2,2><5,0><3,4><4,1><2,2><5,1><3,5><1,2><5,0><2,1><4,1><2,0><4,0><3,5><3,3>
identifieres:a b
unsigned_integer:2 3
題目要求我們輸入程式,輸出對應的單詞數對。通過樣例我們不難發現,這道題的難點在於識別符號和無符號整數變數的判斷;因為如果輸入相同的變數,那麼輸出的單詞數對也應該相同。下面我們簡單來分析一下這道題的解題思路。我們從最容易判斷的分界符開始來看。當分界符為其中的乙個時,直接輸出<3,分界符位置》即可。
再來看看運算子的判斷。如果當前字元為加號或乘號,就要額外判斷下乙個字元是否為=,因為運算子中有+=和*=這兩個運算子;其它的運算子和上面分界符的處理一樣。
無符號整數的判斷稍微困難一些,因為還要額外判斷該整數是否在前面已判斷的串中出現過。如果出現過,就直接輸出之前的單詞數對;如果沒有出現過,就輸出<5,無符號整數個數》。
識別符號的判斷是最難的,因為除了要判斷該識別符號是否已出現過以外,還牽扯到關鍵字的判斷。識別符號結束的判斷我們可以通過判斷下乙個字元是否為字母來實現。在乙個識別符號結束之後,我們首先判斷其是否為關鍵字,如果是關鍵字,輸出<1,關鍵字位置》;如果不是關鍵字,跟前面無符號整數的判斷一樣,額外判斷該識別符號是否出現過,在此不再贅述。
把所有這5種情況判斷完,問題就順利解決了。
#include
#include
using
namespace
std;
struct operators = ; //運算子
struct boundaries = ",",",";" }; //分界符
struct identifieres = ; //識別符號
struct unsigned_integer = ; //無符號整數
void scan(string s)
}for (int j = 0; j < 2; j++)
else }}
if (s[i] == '=')
if (s[i] == ' ' || s[i] == '\n')
if (s[i] >= '0' && s[i] <= '9')
}if (flag)
else }}
if (isalpha(s[i]))
}if (bflag)
}for (int k = 0; k < identifieres.number; k++)
}if (flag) }}
}}
cout
<< "\nidentifieres:";
for (int i = 0; i < identifieres.number - 1; i++)
if(identifieres.number)
cout
<< endl << "unsigned_integer:";
for (int i = 0; i < unsigned_integer.number - 1; i++)
if (unsigned_integer.number)
cout
<< endl;
}int main()
scan(s);
system("pause");
}
Sicily 1000 詞法分析程式設計
description input 輸入一程式,結束符用 output 輸出單詞數對 類號,序號 輸出識別符號表,用空格分隔 輸出無符號整數表,用空格分隔 sample input main sample output 1,1 3,0 3,1 3,2 1,0 4,0 2,2 5,0 3,4 4,1 ...
Sicily1000 自上而下語法分析(一)
輸入開始符號,非終結符,終結符,產生式,ll 1 分析表 輸出ll 1 分析表 g e e e t e t t t t f t f f f e d d x y z 消除左遞迴g1 e e ta a ta ta e t fb b fb fb e f e d d x y z input 輸入開始符號 非...
詞法分析程式
上課沒聽啥,一邊看書,一邊做的。基本上,老師的要求是實現了,能把乙個句子 也可以是一整個程式,但還不完善,由於時間急,很多情況來不及考慮了 中的單詞項分析出它是保留字,還是識別符號,運算子等等。開始是在控制台下做得,也比較純正 lex.h ifndef lex h define lex h incl...