本文目录一览:
Tiny语言和c-相比更为简单,在实现的时候,对文本的读取,发现回车换行是一个头疼的问题,fgetc()函数和fseek()函数并不是一一对应的。fseek()会回车换行算两个字符,而fgetc()读到’\r’或’\n’其中一个都会返回’\n’,也就是说把回车换行符当作一个字符。
代码如下:
#include iostream
#include stdio.h
#include stdlib.h
#include string.h
#define sfName "source.tiny"
#define tfName "target.tiny"
using namespace std;
FILE *source;
FILE *target;
int sequence=0; //目标文件序号
int s[5]={0}; //保存token类型的状态
char str[200]=""; //保存需要返回的字符串
char op[10]={'+','-','*','/',':','=','',';','(',')'};
char line[200]="" //保存一行字符
char *resw[]={"if","then","else","end","repeat","until","read","write"};
char *token[]={"ID","NUM","RESW","OP","ERROR","COM"};
typedef enum{ID=0,NUM,RESW,OP,ERROR,COM}TokenType;
void clearState()
{
memset(s,0,sizeof(s));
memset(str,'\0',sizeof(str));
}
void printStr(TokenType t)
{
if(t==5)
{
fprintf(target,"%d:%s\n",sequence,str);
}else
fprintf(target,"%d:%s,%s\n",sequence,token[t],str);
sequence++;
}
void comment(char ch,int i)
{
bool isExit = false;
int count =0;
while(!feof(source))
{
switch( s[i] )
{
case 0:
if(ch=='{')
{
s[i]=1;
str[count]=ch;
count++;
}
break;
case 1:
if(ch=='}')
{
s[i]=2;
isExit = true;
str[count]=ch;
printStr(COM);
}else
{
s[i]=1;
str[count]=ch;
count++;
}
break;
default:cout"data error\n";
}
if(isExit) return;
ch = fgetc(source);
}
}
void digit(char ch,int i)
{
int cout=0;
bool isExit = false;
while(!feof(source))
{
if(ch='0' ch='9')
{
s[i]=1;
str[cout]=ch;
cout++;
}else
{
s[i]=0;
fseek(source,-1L,1);
printStr(NUM);
isExit = true;
}
if(isExit) return;
ch = fgetc(source);
}
}
bool isOperator(char ch)
{
for(int i=0;i10;i++)
{
if(ch==op[i])
return true;
}
return false;
}
void myOperator(char ch,int i)
{
int count = 0;
while(!feof(source))
{
if(ch=='+' || ch =='-'||ch=='*'||ch=='/'||ch==''||ch=='('||ch==')'||ch==';')
{
str[count]=ch;
printStr(OP);
return;
}else if(ch==':' || ch=='=')
{
switch(s[i])
{
case 0:
if(ch==':')
{
s[i]=1;
str[count]=ch;
count++;
}else
{
s[i]=0;
str[count]=ch;
printStr(OP);
return;
}
break;
case 1:
if(ch=='=')
{
s[i]=2;
str[count]=ch;
printStr(OP);
return;
}
break;
default:cout"data error\n";
}
}else
{
str[count]=ch;
printStr(ERROR);
return;
}
ch = fgetc(source);
}
}
bool isResw()
{
for(int i=0;i8;i++)
{
if(strcmp(str,resw[i])==0)
return true;
}
return false;
}
void identifier(char ch,int i)
{
int cout=0;
while(!feof(source))
{
if((ch='A'ch='Z')||(ch='a'ch='z'))
{
s[i]=1;
str[cout]=ch;
cout++;
}else
{
s[i]=0;
fseek(source,-1L,1); //回退一个字符
if( isResw())
printStr(RESW);
else
printStr(ID);
return;
}
ch = fgetc(source);
}
if(ch == EOF)
{
if( isResw())
printStr(RESW);
else
printStr(ID);
return;
}
}
void scanner()
{
char ch,s;
ch = fgetc(source);
while(!feof(source))
{
for(int i=0;ch!='\n' || ch!=EOF;i++)
{
line[i]=ch;
ch = fgetc(source);
}
for(int j=0;line[j]!='\0';j++)
{
}
if(ch=='\n' ||ch==' '||ch=='\t')
{
;//跳过
}else if(ch=='{')
{
comment(ch,0);
}else if(ch='0' ch='9')
{
digit(ch,1);
}else if( isOperator(ch) )
{
myOperator(ch,2);
}else if((ch='A'ch='Z')||(ch='a'ch='z'))
{
identifier(ch,3);
}else
{
str[0] = ch;
printStr(ERROR);
}
clearState();//清除状态
ch = fgetc(source);
}
}
int main()
{
FILE *fp;
char s;
if((fp=fopen(sfName,"r"))==NULL)
{
printf("file open error!\n");
exit(0);
}else
{
s = fgetc(fp);
while(!feof(fp))
{
printf("%c",s); // diaplay source.tiny
s=fgetc(fp);
}
printf("\n\n");
}
fclose(fp);
if((source=fopen(sfName,"r"))==NULL)
{
printf("文件打开错误!\n");
exit(0);
}
if((target=fopen(tfName,"w"))==NULL)
{
printf("文件打开错误!\n");
exit(0);
}
scanner(); //********************entrance******************************//
fclose(source);
fclose(target);
cout"词法分析如下"endl;
if((fp=fopen(tfName,"r"))==NULL)
{
printf("文件打开错误!\n");
exit(0);
}else
{
s = fgetc(fp);
while(!feof(fp))
{
printf("%c",s); // diaplay target.tiny
s=fgetc(fp);
}
printf("\n\n");
}
fclose(fp);
return 0;
}
1.
编译tinyalsa配套工具
2.
$
mmm
external/tinyalsa/
3.
编译完后会产生tinyplay/tinymix/tinycap等等工具。
4.
tinymix:
查看配置
混音器
5.
tinyplay:
播放音频
6.
tinycap:
录音
7.
8.
2.查看当前系统的声卡
[python]
view
plain
copy
root@android:/
#
cat
/proc/asound/cards
[RKRK616
]:
RK_RK616
-
RK_RK616
RK_RK616
1
[ROCKCHIPSPDIF
]:
ROCKCHIP-SPDIF
-
ROCKCHIP-SPDIF
ROCKCHIP-SPDIF
root@android:/
#
3.tinymix查看混响器
tinymix使用 *** a.不加任何参数-显示当前配置情况
b.tinymix
[ctrl
id]
[var]不加[var]可以查看该[ctrl
id]可选选项。
[python]
view
plain
copy
root@android:/
#
tinymix
Number
of
controls:
7
ctl
type
num
name
value
ENUM
1
Playback
Path
OFF
1
ENUM
1
Capture
MIC
Path
MIC
OFF
2
ENUM
1
Voice
Call
Path
OFF
3
ENUM
1
Voip
Path
OFF
4
INT
2
Speaker
Playback
Volume
5
INT
2
Headphone
Playback
Volume
6
ENUM
1
Modem
Input
Enable
ON
root@android:/
#
4.使用tinyplay播放wav音乐
这个只是一个最基本的播放器,所以不支持播放MP3等等压缩过格式的音乐。没有学会使用前,网上都说很麻烦,但是现在看来一点也不麻烦,直接播放了44.1kHz/44.8kHz的wav音乐。
[python]
view
plain
copy
root@android:/
#
tinyplay
/sdcard/0_16.wav
Playing
sample:
2
ch,
44100
hz,
16
bit
root@android:/
#
注:播放之前得首先使用tinymix把通道设置好,上文中已经给出了设置到扬声器中的例子;由于播放时使用的更大音量进行播放的,所以注意防止被吓到。这里将测试音频文件上传。
5.tinycap使用
root@android:/
#
tinycap
/sdcard/test.wav
可以进行录音。
目前只遇到这些,就先总结到这,可以随时再深入。
1.编译tinyalsa配套工具
$ mmm external/tinyalsa/
编译完后会产生tinyplay/tinymix/tinycap等等工具。
tinymix: 查看配置混音器
tinyplay: 播放音频
tinycap: 录音
2.查看当前系统的声卡
[python] view plain copy
root@android:/ # cat /proc/asound/cards
0 [RKRK616 ]: RK_RK616 - RK_RK616
RK_RK616
1 [ROCKCHIPSPDIF ]: ROCKCHIP-SPDIF - ROCKCHIP-SPDIF
ROCKCHIP-SPDIF
root@android:/ #
3.tinymix查看混响器
tinymix使用 *** a.不加任何参数-显示当前配置情况 b.tinymix [ctrl id] [var]不加[var]可以查看该[ctrl id]可选选项。
[python] view plain copy
root@android:/ # tinymix
Number of controls: 7
ctl type num name value
0 ENUM 1 Playback Path OFF
1 ENUM 1 Capture MIC Path MIC OFF
2 ENUM 1 Voice Call Path OFF
3 ENUM 1 Voip Path OFF
4 INT 2 Speaker Playback Volume 0 0
5 INT 2 Headphone Playback Volume 0 0
6 ENUM 1 Modem Input Enable ON
root@android:/ #
4.使用tinyplay播放wav音乐
这个只是一个最基本的播放器,所以不支持播放MP3等等压缩过格式的音乐。没有学会使用前,网上都说很麻烦,但是现在看来一点也不麻烦,直接播放了44.1kHz/44.8kHz的wav音乐。
[python] view plain copy
root@android:/ # tinyplay /sdcard/0_16.wav
Playing sample: 2 ch, 44100 hz, 16 bit
root@android:/ #
注:播放之前得首先使用tinymix把通道设置好,上文中已经给出了设置到扬声器中的例子;由于播放时使用的更大音量进行播放的,所以注意防止被吓到。这里将测试音频文件上传。
5.tinycap使用
root@android:/ # tinycap /sdcard/test.wav
可以进行录音。
目前只遇到这些,就先总结到这,可以随时再深入。