導航:首頁 > 源碼編譯 > 編譯原理中syn可以改嗎

編譯原理中syn可以改嗎

發布時間:2022-08-15 02:18:35

❶ 一個更新sql語句說is_syn找不到在pl/sql中怎麼改啊,急!!

select * from demand_task_table where is_syn='' ;運行,出錯證明demand_task_table 裡面is_syn沒有這個欄位
select d.is_syn from demand_detail d where d.id=1236;運行,出錯證明demand_detail 裡面is_syn沒有這個欄位

編譯原理語法分析實驗問題

錯誤1:在3.txt中,第二個表達式x:=2*3,在編譯器裡面沒有對*符號進行解釋,這個應補充,或者改掉*為+。
錯誤2:代碼中出現3次類似syn==15||16的代碼,我理解應該是(syn==15)||(syn==16)
改掉這兩點後代碼可以正常運行。
建議:寫代碼是一項工作,更是一個創作過程,建議你按照代碼寫作規范來寫,這樣的代碼清晰易讀,易於交流和糾錯。

❸ 編譯原理實驗「C語言」檢查某段C源程序中,標識符的使用是否正確,即是否先聲明後使用,或

#include "stdio.h" /*定義I/O庫所用的某些宏和變數*/
#include "string.h" /*定義字元串庫函數*/
#include "conio.h" /*提供有關屏幕窗口操作函數*/
#include "ctype.h" /*分類函數*/
char prog[80]=,
token[8]; /*存放構成單詞符號的字元串*/
char ch;
int syn, /*存放單詞字元的種別碼*/
n,
sum, /*存放整數型單詞*/
m,p; /*p是緩沖區prog的指針,m是token的指針*/
char *rwtab[6]=;
void scaner(){
m=0;
sum=0;
for(n=0;n<8;n++)
token[n]='\0';
ch=prog[p++];
while(ch==' ')
ch=prog[p++];
if(isalpha(ch)) /*ch為字母字元*/{
while(isalpha(ch)||isdigit(ch)) /*ch 為字母字元或者數字字元*/{
token[m++]=ch;
ch=prog[p++];}
token[m++]='\0';
ch=prog[p--];
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0) /*字元串的比較*/{
syn=n+1;
break;}}
else
if(isdigit(ch)) /*ch是數字字元*/{
while(isdigit(ch)) /*ch是數字字元*/{
sum=sum*10+ch-'0';
ch=prog[p++];}
ch=prog[p--];
syn=11;}
else
switch(ch){
case'<':m=0;token[m++]=ch;ch=prog[p++];
if(ch=='>'){
syn=21;
token[m++]=ch;}
else if(ch=='='){
syn=22;
token[m++]=ch;}
else{
syn=20;
ch=prog[p--];}
break;
case'>':m=0;token[m++]=ch;ch=prog[p++];
if(ch=='='){
syn=24;
token[m++]=ch;}
else{
syn=23;
ch=prog[p--];}
break;
case':':m=0;token[m++]=ch;ch=prog[p++];
if(ch=='='){
syn=18;
token[m++]=ch;}

else{
syn=17;
ch=prog[p--];}
break;
case'+':syn=13;token[0]=ch;break;
case'-':syn=14;token[0]=ch;break;
case'*':syn=15;token[0]=ch;break;
case'/':syn=16;token[0]=ch;break;
case'=':syn=25;token[0]=ch;break;
case';':syn=26;token[0]=ch;break;
case'(':syn=27;token[0]=ch;break;
case')':syn=28;token[0]=ch;break;
case'#':syn=0;token[0]=ch;break;
default:syn=-1;}}
main()
{
printf("\n\nThe significance of the figures:\n"
"1.figures 1 to 6 said Keyword\n"
"2.figures 10 and 11 said Other indicators\n"
"3.figures 13 to 28 said Operators\n");

p=0;

printf("\nplease input string:\n");
do {
ch=getchar();
prog[p++]=ch;
}while(ch!='#');

p=0;

do{
scaner();
switch(syn){
case 11: printf("(%d,%d)\n",syn,sum);break;
case -1: printf("\n ERROR;\n");break;
default: printf("(%d,%s)\n",syn,token);
}
}while(syn!=0);

getch();
}
程序測試結果
對源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,經過詞法分析後輸出如下圖5-1所示:

具體的你在修改修改吧

❹ 編譯原理課程設計-詞法分析器設計(C語言)

#include"stdio.h"/*定義I/O庫所用的某些宏和變數*/

#include"string.h"/*定義字元串庫函數*/

#include"conio.h"/*提供有關屏幕窗口操作函數*/

#include"ctype.h"/*分類函數*/

charprog[80]={''},

token[8];/*存放構成單詞符號的字元串*/

charch;

intsyn,/*存放單詞字元的種別碼*/

n,

sum,/*存放整數型單詞*/

m,p;/*p是緩沖區prog的指針,m是token的指針*/

char*rwtab[6]={"begin","if","then","while","do","end"};

voidscaner(){

m=0;

sum=0;

for(n=0;n<8;n++)

token[n]='';

ch=prog[p++];

while(ch=='')

ch=prog[p++];

if(isalpha(ch))/*ch為字母字元*/{

while(isalpha(ch)||isdigit(ch))/*ch為字母字元或者數字字元*/{

token[m++]=ch;

ch=prog[p++];}

token[m++]='';

ch=prog[p--];

syn=10;

for(n=0;n<6;n++)

if(strcmp(token,rwtab[n])==0)/*字元串的比較*/{

syn=n+1;

break;}}

else

if(isdigit(ch))/*ch是數字字元*/{

while(isdigit(ch))/*ch是數字字元*/{

sum=sum*10+ch-'0';

ch=prog[p++];}

ch=prog[p--];

syn=11;}

else

switch(ch){

case'<':m=0;token[m++]=ch;ch=prog[p++];

if(ch=='>'){

syn=21;

token[m++]=ch;}

elseif(ch=='='){

syn=22;

token[m++]=ch;}

else{

syn=20;

ch=prog[p--];}

break;

case'>':m=0;token[m++]=ch;ch=prog[p++];

if(ch=='='){

syn=24;

token[m++]=ch;}

else{

syn=23;

ch=prog[p--];}

break;

case':':m=0;token[m++]=ch;ch=prog[p++];

if(ch=='='){

syn=18;

token[m++]=ch;}

else{

syn=17;

ch=prog[p--];}

break;

case'+':syn=13;token[0]=ch;break;

case'-':syn=14;token[0]=ch;break;

case'*':syn=15;token[0]=ch;break;

case'/':syn=16;token[0]=ch;break;

case'=':syn=25;token[0]=ch;break;

case';':syn=26;token[0]=ch;break;

case'(':syn=27;token[0]=ch;break;

case')':syn=28;token[0]=ch;break;

case'#':syn=0;token[0]=ch;break;

default:syn=-1;}}

main()

{

printf(" Thesignificanceofthefigures: "

"1.figures1to6saidKeyword "

"2. "

"3.figures13to28saidOperators ");

p=0;

printf(" pleaseinputstring: ");

do{

ch=getchar();

prog[p++]=ch;

}while(ch!='#');

p=0;

do{

scaner();

switch(syn){

case11:printf("(%d,%d) ",syn,sum);break;

case-1:printf(" ERROR; ");break;

default:printf("(%d,%s) ",syn,token);

}

}while(syn!=0);

getch();

}

程序測試結果

對源程序beginx:=9:ifx>9thenx:=2*x+1/3;end#的源文件,經過詞法分析後輸出如下圖5-1所示:

具體的你在修改修改吧

❺ 急求C/C++做的編譯原理的詞法語法分析程序!

這是我以前學習編譯原理時定的詞法分析程序,可以運行的,供你參考
#include <stdio.h>
#include <string.h>
char prog[80],token[8],ch;
int syn,p,m,n,sum;
char *rwtab[4]={"if","else","while","do"};
scaner();
main()
{p=0;
printf("\n please input a string(end with '#'):");
do{
scanf("%c",&ch);
prog[p++]=ch;
}while(ch!='#');
p=0;
do{
scaner();
switch(syn)
{case 11:printf("( %-10d%5d )\n",sum,syn);
break;
case -1:printf("you have input a wrong string\n");
getch();
exit(0);
default: printf("( %-10s%5d )\n",token,syn);
break;
}
}while(syn!=0);
getch();
}

scaner()
{ sum=0;
for(m=0;m<8;m++)token[m++]=NULL;
ch=prog[p++];
m=0;
while((ch==' ')||(ch=='\n'))ch=prog[p++];
if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
{ while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
{token[m++]=ch;
ch=prog[p++];
}
p--;
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{ syn=n+1;
break;
}
}
else if((ch>='0')&&(ch<='9'))
{ while((ch>='0')&&(ch<='9'))
{ sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;
syn=11;
}
else switch(ch)
{ case '<':token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{ syn=22;
token[m++]=ch;
}
else
{ syn=20;
p--;
}
break;
case '>':token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{ syn=24;
token[m++]=ch;
}
else
{ syn=23;
p--;
}
break;
case '+': token[m++]=ch;
ch=prog[p++];
if(ch=='+')
{ syn=17;
token[m++]=ch;
}
else
{ syn=13;
p--;
}
break;

case '-':token[m++]=ch;
ch=prog[p++];
if(ch=='-')
{ syn=29;
token[m++]=ch;
}
else
{ syn=14;
p--;
}
break;

case '!':ch=prog[p++];
if(ch=='=')
{ syn=21;
token[m++]=ch;
}
else
{ syn=31;
p--;
}
break;

case '=':token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{ syn=25;
token[m++]=ch;
}
else
{ syn=18;
p--;
}
break;
case '*': syn=15;
token[m++]=ch;
break;
case '/': syn=16;
token[m++]=ch;
break;
case '(': syn=27;
token[m++]=ch;
break;
case ')': syn=28;
token[m++]=ch;
break;
case '{': syn=5;
token[m++]=ch;
break;
case '}': syn=6;
token[m++]=ch;
break;
case ';': syn=26;
token[m++]=ch;
break;
case '\"': syn=30;
token[m++]=ch;
break;
case '#': syn=0;
token[m++]=ch;
break;
case ':':syn=17;
token[m++]=ch;
break;
default: syn=-1;
break;
}
token[m++]='\0';
}

❻ 關於syn/ack攻擊,如何消除阿!

■ SYN cookies技術 我們知道,TCP協議開辟了一個比較大的內存空間backlog隊列來存儲半連接條目,當SYN請求不斷增加,並這個空間,致使系統丟棄SYN連接。為使半連接隊列被塞滿的情況下,伺服器仍能處理新到的SYN請求,SYN cookies技術被設計出來。 SYN cookies應用於linux、FreeBSD等操作系統,當半連接隊列滿時,SYN cookies並不丟棄SYN請求,而是通過加密技術來標識半連接狀態。 在TCP實現中,當收到客戶端的SYN請求時,伺服器需要回復SYN+ACK包給客戶端,客戶端也要發送確認包給伺服器。通常,伺服器的初始序列號由伺服器按照一定的規律計算得到或採用隨機數,但在SYN cookies中,伺服器的初始序列號是通過對客戶端IP地址、客戶端端囗、伺服器IP地址和伺服器端囗以及其他一些安全數值等要素進行hash運算,加密得到的,稱之為cookie。當伺服器遭受SYN攻擊使得backlog隊列滿時,伺服器並不拒絕新的SYN請求,而是回復cookie(回復包的SYN序列號)給客戶端, 如果收到客戶端的ACK包,伺服器將客戶端的ACK序列號減去1得到cookie比較值,並將上述要素進行一次hash運算,看看是否等於此cookie。如果相等,直接完成三次握手(注意:此時並不用查看此連接是否屬於backlog隊列)。 在RedHat linux中,啟用SYN cookies是通過在啟動環境中設置以下命令來完成: # echo 1 > /proc/sys/net/ipv4/tcp_syncookies ■ 增加最大半連接數 大量的SYN請求導致未連接隊列被塞滿,使正常的TCP連接無法順利完成三次握手,通過增大未連接隊列空間可以緩解這種壓力。當然backlog隊列需要佔用大量的內存資源,不能被無限的擴大。 WIN2000:除了上面介紹的TcpMaxHalfOpen, TcpMaxHalfOpenRetried參數外,WIN2000操作系統可以通過設置動態backlog(dynamic backlog)來增大系統所能容納的最大半連接數,配置動態backlog由AFD.SYS驅動完成,AFD.SYS是一種內核級的驅動,用於支持基於window socket的應用程序,比如ftp、telnet等。AFD.SYS在注冊表的位置:HKLM\\System\\CurrentControlSet\\Services\\AFD\\值為1時,表示啟用動態backlog,可以修改最大半連接數。 MinimumDynamicBacklog表示半連接隊列為單個TCP端囗分配的最小空閑連接數,當該TCP端囗在backlog隊列的空閑連接小於此臨界值時,系統為此端囗自動啟用擴展的空閑連接(DynamicBacklogGrowthDelta),Microsoft[s:148]該值為20。 MaximumDynamicBacklog是當前活動的半連接和空閑連接的和,當此和超過某個臨界值時,系統拒絕SYN包,Microsoft[s:148]MaximumDynamicBacklog值不得超過2000。 DynamicBacklogGrowthDelta值是指擴展的空閑連接數,此連接數並不計算在MaximumDynamicBacklog內,當半連接隊列為某個TCP端囗分配的空閑連接小於MinimumDynamicBacklog時,系統自動分配DynamicBacklogGrowthDelta所定義的空閑連接空間,以使該TCP端囗能處理更多的半連接。Microsoft[s:148]該值為10。 LINUX:Linux用變數tcp_max_syn_backlog定義backlog隊列容納的最大半連接數。在Redhat 7.3中,該變數的值默認為256,這個值是遠遠不夠的,一次強度不大的SYN攻擊就能使半連接隊列占滿。我們可以通過以下命令修改此變數的值: # sysctl -w net.ipv4.tcp_max_syn_backlog=\"2048\" Sun Solaris Sun Solaris用變數tcp_conn_req_max_q0來定義最大半連接數,在Sun Solaris 8中,該值默認為1024,可以通過add命令改變這個值: # ndd -set /dev/tcp tcp_conn_req_max_q0 2048 HP-UX:HP-UX用變數tcp_syn_rcvd_max來定義最大半連接數,在HP-UX 11.00中,該值默認為500,可以通過ndd命令改變默認值: #ndd -set /dev/tcp tcp_syn_rcvd_max 2048 ■縮短超時時間 上文提到,通過增大backlog隊列能防範SYN攻擊;另外減少超時時間也使系統能處理更多的SYN請求。我們知道,timeout超時時間,也即半連接存活時間,是系統所有重傳次數等待的超時時間總和,這個值越大,半連接數佔用backlog隊列的時間就越長,系統能處理的SYN請求就越少。為縮短超時時間,可以通過縮短重傳超時時間(一般是第一次重傳超時時間)和減少重傳次數來實現。 Win2000第一次重傳之前等待時間默認為3秒,為改變此默認值,可以通過修改網路接囗在注冊表裡的TcpInitialRtt注冊值來完成。重傳次數由 來定義,注冊表的位置是:HKLM\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters registry key。 當然我們也可以把重傳次數設置為0次,這樣伺服器如果在3秒內還未收到ack確認包就自動從backlog隊列中刪除該連接條目。 LINUX:Redhat使用變數tcp_synack_retries定義重傳次數,其默認值是5次,總超時時間需要3分鍾。 Sun Solaris Solaris 默認的重傳次數是3次,總超時時間為3分鍾,可以通過ndd命令修改這些默認值。

❼ syn攻擊是什麼有什麼有效的防禦手段嗎

先說說syn攻擊是什麼
SYN攻擊屬於DOS攻擊的一種,它利用TCP協議缺陷,通過發送大量的半連接請求,耗費CPU和內存資源。SYN攻擊除了能影響主機外,還可以危害路由器、防火牆等網路系統。
一般的syn防禦手段是:
1、過濾網關防護

這里,過濾網關主要指明防火牆,當然路由器也能成為過濾網關。防火牆部署在不同網路之間,防範外來非法攻擊和防止保密信息外泄,它處於客戶端和伺服器之間,利用它來防護SYN攻擊能起到很好的效果。過濾網關防護主要包括超時設置,SYN網關和SYN代理三種。

2、加固tcp/ip協議棧

防範SYN攻擊的另一項主要技術是調整tcp/ip協議棧,修改tcp協議實現。主要方法有SynAttackProtect保護機制、SYN cookies技術、增加最大半連接和縮短超時時間等。tcp/ip協議棧的調整可能會引起某些功能的受限,管理員應該在進行充分了解和測試的前提下進行此項工作。

但是要想徹底的防禦syn攻擊我建議
我個人認為這些(arp\udp\tcp syn攻擊都是底層協議漏洞造成的。
一些傳統的360衛士、arp防火牆,殺毒軟體我都試過了也都不行。
要想徹底解決內網問題,我建議你可以試試免疫網路解決方案,我之前的內網攻擊問題都是通過免疫網路解決的。

❽ 如何實現syn攻擊

對付SYN FLood攻擊,可以採取以下幾種方式進行緩解:
第一,減少系統SYN等待時間(只能緩解攻擊),
第二,對攻擊源地址進行過濾(但是對於偽造精細的報文無效),
第三,修改系統SYN_back_log上限(只能緩解攻擊),
第四,將系統SYN的重發次數降低(可以緩解攻擊),
第五,如果是Linux系統,可以升級內核並設置Syn_cookies(極大緩解攻擊)。
如果需要根治這種攻擊,就必須在要保護的主機或網段前添加專門的防攻擊的過濾設備了,而且通常的防火牆,很可能也無法抵禦這種行為。

❾ win7可以支持syn掃描嗎

  1. win7不支持syn掃描。

  2. SYN(synchronous)是TCP/IP建立連接時使用的握手信號。在客戶機和伺服器之間建立正常的TCP網路連接時,客戶機首先發出一個SYN消息,伺服器使用SYN+ACK應答表示接收到了這個消息,最後客戶機再以ACK消息響應。這樣在客戶機和伺服器之間才能建立起可靠的TCP連接,數據才可以在客戶機和伺服器之間傳遞。TCP連接的第一個包,非常小的一種數據包。SYN攻擊包括大量此類的包,由於這些包看上去來自實際不存在的站點,因此無法有效進行處理。每個機器的欺騙包都要花幾秒鍾進行嘗試方可放棄提供正常響應。關於SYN攻擊防範技術,主要有兩大類,一類是通過防火牆、路由器等過濾網關防護,另一類是通過加固TCP/IP協議棧防範。

閱讀全文

與編譯原理中syn可以改嗎相關的資料

熱點內容
UG編程如何多平面輪廓2D倒角 瀏覽:437
視頻壓縮漸變紋 瀏覽:851
什麼app能看財經新聞 瀏覽:39
數學奇跡神奇運演算法 瀏覽:360
大廠的程序員的水平如何 瀏覽:701
遺傳演算法入門經典書籍 瀏覽:879
源碼炮台腳本 瀏覽:621
在位編輯命令 瀏覽:348
曲式分析基礎教程pdf 瀏覽:15
php生成靜態html頁面 瀏覽:965
怎麼分割pdf 瀏覽:813
壓縮垃圾報警器 瀏覽:629
小公司一般都用什麼伺服器 瀏覽:968
java獲取時間gmt時間 瀏覽:821
為什麼csgo一直連接不到伺服器 瀏覽:504
安卓登ins需要什麼 瀏覽:836
機器人演算法的難點 瀏覽:227
全自動化編程 瀏覽:728
程序員高薪限制 瀏覽:693
壓縮圖片壓縮 瀏覽:76