always@(posedge clk)
begin
singnal => ;
end
在时序逻辑的赋值里面必须用阻塞赋值
而且一个always块 *** 作一个被赋值信号!
修改前:
always@(posedge clk)
begin
if(aaa==0)
begin
aaa=1;
show=0;
end
else
begin
show=show+1;
end
end
修改后:
//for reg aaa
always@(posedge clk)
begin
if(aaa==0)
aaa《=1;
end
//for reg show
always@(posedge clk) begin
if(aaa==0)
show => 1'b0;
else
begin
show=>show+1;
end
end
请分清楚是同步reset还是异步reset
always@(posedge rst)
begin
aaa=0;
end
你这种写法会使编译器发疯的
想一想:如果posedge rst && aaa==0
然后aaa的值是多少???
所以你应该这么写
1根据一个always块 *** 作一个被赋值信号
always@(posedge clk or posedge rst)
if(rst)
aaa => 1'b0;
else
if ()
else
end
最后一点,请把名字起得好一点 通俗一点
别起什么aaa的破名字!!
VB代码如下:
VERSION 500
Begin VBForm Form1
Caption = "随机字符串"
ClientHeight = 6420
ClientLeft = 120
ClientTop = 450
ClientWidth = 7740
LinkTopic = "Form1"
ScaleHeight = 6420
ScaleWidth = 7740
StartUpPosition = 3 '窗口缺省
Begin VBTextBox Text2
BeginProperty Font
Name = "宋体"
Size = 2175
Charset = 134
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 2295
Left = 240
MultiLine = -1 'True
TabIndex = 5
Top = 3120
Width = 5175
End
Begin VBTextBox Text1
BeginProperty Font
Name = "宋体"
Size = 2175
Charset = 134
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 2295
Left = 240
MultiLine = -1 'True
TabIndex = 4
Top = 480
Width = 5175
End
Begin VBCommandButton Command4
Caption = "按钮4"
Height = 975
Left = 5640
TabIndex = 3
Top = 4440
Width = 1695
End
Begin VBCommandButton Command3
Caption = "按钮3"
Height = 975
Left = 5640
TabIndex = 2
Top = 3120
Width = 1695
End
Begin VBCommandButton Command2
Caption = "按钮2"
Height = 975
Left = 5640
TabIndex = 1
Top = 1800
Width = 1695
End
Begin VBCommandButton Command1
Caption = "按钮1"
Height = 975
Left = 5640
TabIndex = 0
Top = 480
Width = 1695
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim i As Integer, k As Integer
''按钮1
Private Sub Command1_Click()
Randomize (Time)
For i = 1 To Len(Text1Text) Step 1
If Mid(Text1Text, i, 1) = "" Then
Text1Text = Mid(Text1Text, 1, i - 1) & (Int(Rnd() 100) Mod 10) & Mid(Text1Text, i + 1, Len(Text1Text))
End If
Next i
End Sub
''按钮2
Private Sub Command2_Click()
Randomize (Time)
For i = 1 To Len(Text1Text) Step 1
If Mid(Text1Text, i, 1) = "" Then
Text1Text = Mid(Text1Text, 1, i - 1) & Chr(Int(Rnd() 100) Mod 26 + 97) & Mid(Text1Text, i + 1, Len(Text1Text))
End If
Next i
End Sub
''按钮3
Private Sub Command3_Click()
Randomize (Time)
For i = 1 To Len(Text1Text) Step 1
If Mid(Text1Text, i, 1) = "" Then
k = (Int(Rnd() 100) Mod 36)
If k < 10 Then
Text1Text = Mid(Text1Text, 1, i - 1) & k & Mid(Text1Text, i + 1, Len(Text1Text))
Else
Text1Text = Mid(Text1Text, 1, i - 1) & Chr(k + 87) & Mid(Text1Text, i + 1, Len(Text1Text))
End If
End If
Next i
End Sub
''按钮4
Private Sub Command4_Click()
ClipboardSetText (Text1Text)
Text2Text = ClipboardGetText()
End Sub
任务1:识别小型语言所有单词的词法分析程序设计
源程序设计语言 G[<程序>]
<程序>→<变量说明><BEGIN> <语句表> <END>
<变量说明>→VAR<变量表>:<类型>;|<空>
<变量表>→<变量表>,<变量>|<变量>
<类型>→INTEGER
<语句表>→<语句> | <语句>;<语句表>
<语句>→<赋值语句>|<条件语句>|<WHILE语句>|<复合语句>
<赋值语句>→<变量>:=<算术表达式>
<条件语句>→IF<关系表达式>THEN<语句>ELSE<语句>
<WHILE语句>→WHILE<关系表达式>DO<语句>
<复合语句>→BEGIN<语句表>END
<算术表达式>→<项>|<算术表达式>+<项>|<算术表达式>-<项>
<项>→<因式>|<项><因式>|<项>/<因式>
<因式>→<变量>|<整数>|(<算术表达式>)
<关系表达式>→<算术表达式><关系符><算术表达式>
<变量>→<标识符>
<标识符>→<标识符><字母>|<标识符><数字>|<字母>
<整数>→0|<非零数字><泛整数>
<泛整数>→<数字>|<数字><泛整数>|ε
<关系符>→<|<=|==|>|>=|<>
<字母>
→A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z
<非零数字>→1|2|3|4|5|6|7|8|9
<数字>→<非零数字>|0
<空>→
要求和提示:
词法分析阶段,可以打开任意位置和名称的源文件进行词法分析,可以进行非法字符和数字后边跟字母的错误判断,如果没有错误则提示“词法分析正确完成!”,并且可以选择输出tokentxt(token文件)stringtxt(符号表)两个文件;
1.词法分析程序的主要任务如下:
① 组织源程序的输入,识别出源程序中的各个基本语法单位(也称为单词或语法符号),按规则转换成二元式的形式;
② 删除无用的空白字符、回车符、及其它非实质性符号;
③ 删除注解行;
④ 为后面的语法和语义分析提供二元式链表;
单词 编码 单词 编码
标识符 1 < 15
正整数 2 <= 16
BEGIN 3 > 17
END 4 >= 18
IF 5 <> 19
THEN 6 == 20
ELSE 7 ; 21
WHILE 8 . 22
DO 9 := 23
INTEGER 10 , 24
+ 11 ( 25
- 12 ) 26
13
/ 14
1) 对标识符的长度控制在8个字符(包括8个)以内,超过的做截断处理;
2) 数字不大于65535,否则报错;
3) 能跳过源程序中的空白格:两个单词之间的任何空格,制表符,回车,换行都是白空格,除了用来分隔单词以外,没有意义;
4) 能跳过注释:
a) 接连出现的/到下一次接连出现的/之间的任何文字都是注释(多行);
b) 从某行接连出现的//到该行的结尾的任何文字都是注释(单行)。
3怎样编写词法分析程序:
1) 预处理:把源文件一个字符一个字符的读入词法分析程序设置的输入字符结构体数组中(输入缓冲区),读入过程要删除注释,删除多余的白空格;
2) 从源程序字符数组中获得单词, 编码为二元式:
二元式采用结构体数组存储, 把单词类型和词元记录下来。
分解单词的方法:
1) Case多路转换语句根据单词的特点直接编写;
2) 通过描述单词的正规文法得到相应的有穷自动机,通过case多路转换语句完成有穷自动机的处理流程。
3.编写词法分析程序要注意的问题:
1) 检查词法是否有错误
检查是否有非法字符:如 @, &, !
检查标志符和数字是否满足限制条件
检查注释符号是否配对
2) 符分隔单词
能够区分两个单词的符号为界符
有些界符不是单词:如白空格
有些界符仅仅用来分隔:如;
有些界符本身还是源程序不可缺少的单词,如(, ), +, /, 等等
有些界符包含两个字符:如<>, >=等等
3) 输出词法错误
如果有错误,需要报告词法错误的原因。并且要能够越过错误,分解下一个单词,直到源程序结束。
4) 输出的二元式流保存在二元式结构体数组中。
你好,希望采纳!
1L的哥们竟然没有分数也没有读写文件记录,我在他的基础上加了这个功能,采纳谁都可以哦~
#include <stdioh>
#include <ctypeh>
#include <timeh>
#include <stdlibh>
#include <windowsh>
#define IDNO_LENGTH 6
#define CALC_KIND 4
#define CALC_NUM 10
bool checkNo(char idNo[]);
char getSignal();
int getResult(int,int,char);
void takeTest();
//main函数
void main()
{
printf("Please input your four digit ID no(begin with two letters):");
char idNo[IDNO_LENGTH];
do
{
scanf("%s",&idNo);
fflush(stdin);
} while(checkNo(idNo)==false);
printf("1Start a test\t2Check score\t3Exitb\n");
int choose;
do
{
printf("选择:");
scanf("%d",&choose);
fflush(stdin);
} while(choose!=1 && choose!=2&& choose!=3);
if(choose==1)
{
takeTest();
}else if(choose==2)
{
FILE fp;
char ch;
if((fp=fopen("scoretxt","rt+"))==NULL)
{
printf("\n你还没做过题目测试");
getch();
exit(1);
}
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
}
else
{
exit(0);
}
}
//获取随机运算符
char getSignal()
{
char signal[CALC_KIND]={'+','-','','/'};
srand((unsigned)time(NULL));
return signal[rand()%4];
}
//获取随机数
int random(double start, double end)
{
return (int)(start+(end-start)rand()/(RAND_MAX+ 10));
}
//运算
int getResult(int num1,int num2,char signal)
{
int res;
switch(signal)
{
case '+':
res=num1+num2;break;
case '-':
res=num1-num2;break;
case '':
res=num1num2;break;
case '/':
res=num1/num2;break;
default:
res=0;
printf("运算符不符合规则\n");
}
return res;
}
//列出10道题
void takeTest()
{
printf("开始答题,每道题10分,总共100分\n");
clock_t startTime;
startTime=clock();
int index;
int giveRes;
int num1;
int num2;
int score=0;
char signal;
for(index=0;index<CALC_NUM;index++)
{
srand((unsigned)time(NULL));
signal=getSignal();
num1=random(0,100);
num2=random(1,100);
printf("%d%c%d=",num1,signal,num2);
scanf("%d",&giveRes);
fflush(stdin);
if(getResult(num1,num2,signal)==giveRes)
{
printf("correct\n");
score+=10;
}
else
{
printf("wrong\n");
}
}
FILE fp=fopen("scoretxt","w");
fprintf(fp,"分数为%d",score);
fclose(fp);
printf("解10道题用了%lf秒\n",(double)(clock()- startTime)/CLOCKS_PER_SEC);
}
//检测idNo是否合规则,合规则返回true
bool checkNo(char idNo[])
{
int index;
bool flag;
flag=true;
for(index=0;index<IDNO_LENGTH;index++)
{
if(index<2)
{
if(!isalpha(idNo[index]))
{
flag=false;
printf("ID no 不符合规则,重新输入:");
break;
}
}
else
{
if(!isdigit(idNo[index]))
{
flag=false;
printf("ID no 不符合规则,重新输入:");
break;
}
}
}
return flag;
}
(1)var si,pr:set of 2n; 是集合
(2)表示集合为空,初始值
(3)while not(x in si) {当x这个值不在集合si中时}
x in si 就是 x这个元素在si这个集合中
一、集合类型
集合是由具有某些共同特征的元素构成的一个整体。在pascal中,一个集合是由具有同一有序类型的一组数据元素所组成,这一有序类型称为该集合的基类型。
(一)集合类型的定义和变量的说明
集合类型的一般形式为:
set of <基类型>;
说明:①基类型可以是任意顺序类型,而不能是实型或其它构造类型;同时,基类型的数据的序号不得超过255。例如下列说明是合法的
type letters=set of 'A''Z';
numbers=set of 09;
s1=set of char;
ss=(sun,mon,tue,wed,thu,fri,sat);
s2=set of ss;
②与其它自定义类型一样,可以将类型说明与变量说明合并在一起。如:
type numbers=set of 09;
var s:numbers;
与 var s:set of 09;等价。
(二)集合的值
集合的值是用"〔"和"〕"括起来,中间为用逗号隔开的若干个集合的元素。如:
[] 空集
[1,2,3]
['a','e','i','o','u']
都是集合。
说明:①集合的值放在一对方括号中,各元素之间用逗号隔开
②在集合中可以没有任何元素,这样的集合称为空集
③在集合中,如果元素的值是连续的,则可用子界型的表示方法表示。例如:
〔1,2,3,4,5,7,8,9,10,15〕
可以表示成:
〔15,710,15〕
④集合的值与方括号内元素出现的次序无关。例如,〔1,5,8 〕和〔5,1,8〕的值相等。
⑤在集合中同一元素的重复出现对集合的值没有影响。例如,〔1,8,5,1,8〕与〔1,5,8〕的值相等。
⑥每个元素可用基类型所允许的表达式来表示。如〔1,1+2,4〕、〔ch〕、〔succ(ch)〕。
(三)集合的运算
1、赋值运算:只能通过赋值语句给集合变量赋值,不能通过读语句赋值,也不能通过write(或writeln)语句直接输出集合变量的值
2、集合的并、交、差运算:可以对集合进行并、交、差三种运算,每种运算都只能有一个运算符、两个运算对象,所得结果仍为集合。三种运算符分别用"+"、"*"、"-"表示;注意它们与算术运算的区别
3、集合的关系运算:集合可以进行相等或不相等、包含或被包含的关系运算,还能测试一个元素是否在集合中。所用的运算符分别是:=、<>、>=、<=、in
它们都是二目运算,且前4个运算符的运算对象都是相容的集合类型,最后一个运算符的右边为集合,左边为与集合基类型相同的表达式。
例4设有如下说明:
type weekday=(sun,mon,tue,wed,thu,fri,sat);
week=set of weekday;
subnum=set of 150;
写出下列表达式的值:
⑴〔sun,sat〕+〔sun,tue,fri〕
⑵〔sun,fri〕〔mon,tue〕
⑶〔sun,sat〕〔sunsat〕
⑷〔sun〕-〔mon,tue〕
⑸〔mon〕-〔mon,tue〕
⑹〔sunsat〕-〔mon,sun,sat〕
⑺〔1,2,3,5〕=〔1,5,3,2〕
⑻〔1,2,3,4〕<>〔14〕
⑼〔1,2,3,5〕>=〔13〕
⑽〔15〕<=〔14〕
⑾〔1,2,3〕<=〔13〕
⑿ 2 in〔110〕
答:表达式的值分别是:
⑴ 〔sun,sat,tue,fri〕
⑵ 〔 〕
⑶ 〔sun,sat〕
⑷ 〔sun〕
⑸ 〔 〕
⑹ 〔tuefri〕
⑺ TRUE
⑻ FALSE
⑼ TRUE
⑽ FALSE
⑾ TRUE
⑿ TRUE
例5输入一系列字符,对其中的数字字符、字母字符和其它字符分别计数,输入“?”后结束
源程序如下:
program ex10_2;
var id,il,io:integer;
ch:char;
letter:set of char;
digit:set of '0''9';
begin
letter=['a''z','A''Z'];
digit:=['0''9'];
id:=0;il:=0;io:=0;
repeat
read(ch);
if ch in letter
then il:=il+1
else if ch in digit
then id:=id+1
else io:=io+1;
until ch='';
writeln('letter:',il,'digit:',id,'Other:',io);
end
二、记录类型
在程序中对于组织和处理大批量的数据来说,数组是一种十分方便而又灵活的工具,但是数组在使用中有一个基本限制,这就是:一个数组中的所有元素都必须具有相同的类型。但在实际问题中可能会遇到另一类数据,它是由性质各不相同的成份组成的,即它的各个成份可能具有不同的类型。例如,有关一个学生的数据包含下列项目:
学号 字符串类型
姓名 字符串类型
年龄 整型
性别 字符型
成绩 实型数组
Pascal给我们提供了一种叫做记录的结构类型;在一个记录中,可以包含不同类型的并且互相相关的一些数据。
(一)记录类型的定义
在pascal中,记录由一组称为“域”的分量组成,每个域可以具有不同的类型,记录类型定义的一般形式:
record
<域名1>:<类型1>;
<域名2>:<类型2>;
: :
: :
<域名n>:<类型n>;
end;
说明:①域名也称域变量标识符, 应符合标识符的语法规则;在同一个记录中类型中,各个域不能取相同的名,但在不同的记录类型中,两个类型中的域名可以相同
②记录类型的定义和记录变量可以合并为一个定义,如:
type date=record
year:19001999;
month:112;
day:131
end;
var x:date;
可以合并成:
var x: record
year:19001999;
month:112;
day:131
end;
③对记录的 *** 作,除了可以进行整体赋值, 只能对记录的分量——域变量进行。
④域变量的表示方法如下:
记录变量名域名
如前面定义的记录X,其3个分量分别为:xyear;xmonth;xday
⑤域变量的使用和一般的变量一样, 即域变量是属于什么数据类型,便可以进行那种数据类型所允许的 *** 作。
(二)记录的嵌套
当一个记录类型的某一个域类型也是记录类型的时候,我们说发生了记录的嵌套,看下面的例子:
例6某人事登记表可用一个记录表示,其中各项数据具有不同的类型,分别命名一个标识符。而其中的“出生年月日”又包括三项数据,还可以用一个嵌套在内层的记录表示。
具体定义如下:
type sexs=(male,female);
date=record
year:19001999;
month:112;
day:131;
end;
personal=record
name:string[15];
sex:sexs;
birthdate:date;
home:string[40];
end;
例7设计一个函数比较两个dates日期类型记录变量的迟早。
设函数名、形参及函数类型定义为:
AearlyB(A,B:dates):boolean;
函数的形参为两个dates类型的值参数。当函数值为true 时表示日期A早于日期B,否则日期A迟于日期B或等于日期B。显然不能对A、B两个记录变量直接进行比较,而要依具体的意义逐域处理。
源程序如下:
program ex6_7;
type dates=record
year:19001999;
month:112;
day:131
end;
var x,y:dates;
function AearlyB(A,B:dates):boolean;
var earln:boolean;
begin
early:=false;
if (Ayear<Byear) then early:=true;
if (Ayear=Byear)and(Amonth<Bmonth)
then early:=true;
if (Ayear=Byear)and(Amonth=Bmonth)and(Aday<Bday)
then early:=true;
AearlyB:=early;
end;{of AearlyB}
begin
write('Input DATE X(mm-dd-yy):')readln(Xmonth,Xday,Xyear);
write('Input DATE Y(mm-dd-yy):')readln(Ymonth,Yday,Yyear);
if AearlyB(X,Y) then writeln(Date X early!') else writeln('Date X not early!');
end
(三)开域语句
在程序中对记录进行处理时,经常要引用同一记录中不同的域,每次都按641节所述的格式引用,非常乏味。为此Pascal提供了一个with语句,可以提供引用域的简单形式。开域语句一般形式:
with <记录变量名表> do
<语句>
功能:在do后的语句中使用with后的记录的域时, 只要直接写出域名即可,即可以省略图1022中的记录变量名和""。
说明:①一般在with后只使用一个记录变量名。如:
write('Input year:');
readln(xyear);
write('Input month:');
readln(xmonth);
write('Input day:');
readln(xday);
可以改写成:
with x do
begin
write('Input year:');readln(year);
write('Input month:');readln(month);
write('Input day:');readln(day);
end;
②设x,y是相同类型的记录变量,下列语句是非法的:
with x,y do;
③with后接若干个记录名时,应是嵌套的关系。如有记录说明:
var x:record
i:integer;
y:record
j:05;
k:real;
end;
m:real
end;
可以使用:
with x do
begin
read(i);
with y do
read(j,k);
readln(m);
end;
或简写为:
with x,y do
readln(i,j,k,m);
例8读入10个日期,再对每个日期输出第二天的日期。输入日期的格式是月、日、年,如9□30□1993,输出的格式为10/1/1993
分析:可用一个记录变量today表示日期。 知道一个日期后要更新为第二天的日期,应判断输入的日期是否为当月的最后一天,或当年的最后一天。
源程序如下:
program ex6_8;
type date=record
month:112;
day:131;
year:19001999;
end;
var today:array[110]of date;
i:integer;
maxdays:2831;
begin
for i:=1 to 10 do {输入10个日期}
with today[i] do
readln(month,day,year);
for i:=1 to 10 do
with today[i] do{求第i个日期中月份最后一天maxdays}
begin
case month of
1,3,5,7,8,10,12:maxdays:=31;
4,6,9,11 :maxdays:=30;
2 :if(year mod 400=0) or( year mod 4=0)
and(year mod 100<>0)
then maxdays:=29
else maxdays:=28;
end;
if day=maxdays
then begin
day:=1;
if month=12
then begin
month:=1;year:=year+1;
end
else month:=month+1;
end
else day:=day+1;
writeln(month,'/',day,'/',year);
end;
end
五、应用实例
例9编制用筛法求1-n(n≤200)以内素数的程序
分析:由希腊著名数学家埃拉托色尼提出的所谓“筛法”,步骤如下:
①将所有候选数放入筛中;
②找筛中最小数(必为素数)next,放入集合primes中;
③将next的所有倍数从筛中筛去;
④重复②~④直到筛空。
编程时,用集合变量sieve表示筛子,用集合primes存放所有素数。
源程序如下:
program ex10_3;
const n=200;
var sieve,primes:set of 2n;
next,j:integer;
begin
sieve:=[2n];{将所有候选数放入筛中}
primes:=[];{素数集合置空}
next:=2;
repeat
{找筛sieve中最小一个数}
while not(next in sieve) and(next<=n)do
next:=succ(next);
primes:=primes+[next];{将最小数放入素数集合中}
{将这个素数的倍数从筛中删去}
j:=next;
while j<=n do
begin
sieve:=sieve-[j];
j:=j+next;
end
until sieve=[];
j:=0;
for next:=2 to n do{打印出所有素数}
if next in primes then
begin
write(next:5);
j:=j+1;
if j mod 10=0 then writeln;
end;
writeln;
end
可以定义一个全局变量用来记录正确的数目,并在窗体创建时赋初始值:
procedure TForm1FormCreate(Sender: TObject);
begin
i := 0;
end;
//随机生成数:
procedure TForm1Button1Click(Sender: TObject);
var z,j : integer;
begin
Randomize;
j := random(1000);
z := random(1000);
label1Caption := inttostr(j);
label2Caption := inttostr(z);
end;
//当按下enter键时判断答案是否正确:
procedure TForm1Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
begin
if edit1Text =inttostr(strtoint(label1Caption) + strtoint(label2Caption)) then
begin
label3Caption :='タ絋';
i := i+1;
edit2Text := inttostr(i);
end
else
label3Caption := '';
end;
end;
以上就是关于verilog小程序求救全部的内容,包括:verilog小程序求救、求帮写一个小程序。什么语言都行。要可以运行、设计一个小语言的词法分析程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)