當前位置:首頁 » 編程語言 » 用c語言寫解釋器
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

用c語言寫解釋器

發布時間: 2022-06-26 19:58:13

c語言腳本解釋器

記錄大括弧!!!
遇到if則判斷語句,接下來,然後假設判斷式成立,執行if緊跟著的語句,把大括弧括起來的當成一個語句,執行下去,如果沒有else的話就繼續,有else的話跳過else所包含的范圍.

❷ 怎麼用c語言寫腳本解釋器

泠泠七弦上,靜聽松風寒。
古調雖自愛,今人多不彈。
泠泠七弦上,靜聽松風寒。
古調雖自愛,今人多不彈。
泠泠七弦上,靜聽松風寒。
古調雖自愛,今人多不彈。
泠泠七弦上,靜聽松風寒。
古調雖自愛,今人多不彈。

❸ 誰幫我使用C語言編寫一個JavaScript腳本解釋器急求

這個比價麻煩1)
JS 語法,至少表達式,變數要有。
2)HTML

document.write
需要寫在HTML對應的位置。

❹ 如何用C語言實現C的解釋器

將C語言翻譯成「匯編」塞到內存里,然後用「虛擬機」來跑這段匯編。

因此我們需要的東西是:

一個虛擬機:用來跑下面這種匯編。

一種匯編:用來描述原來的C語言。

一個「翻譯器」:將C語言翻譯成上面這種匯編。

❺ C語言中_是什麼意思有什麼用處

C語言中_是標識符中的合法字元之一。它通常用來隔離標識符中的各個單詞,例如room_1,也可以用來與另一同名變數進行區分,例如,int ab,_ab;

❻ 用c語言寫一個算術表達式的解釋器,但這解釋器裡面要用到詞法分析器的結果怎麼套進去是兩個不同的程序呀

用c語言寫一個算術表達式的解釋器,但這解釋器裡面要用到詞法分析器的結果怎麼套進去是兩個不同的程

❼ 如何用c語言寫一個shell

鳥哥是不會有這個的,可以這樣想(感覺這樣很麻煩,只用一對管道應該也可以,流程也能簡單,控制好進程順序就行。這個編得過):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>

#define CMD_LINE 1024
#define PIPE_MAX 16
#define ARG_MAX 10

typedef struct {
char *arg[ARG_MAX];
char *in;
char *out;
} cmd_t;

extern int parse_token(char *buf, cmd_t cmd[]);
extern int parse(char *buf, cmd_t * cmd);
extern int test_parse(cmd_t cmd[], int len);

int main(int argc, char *argv[])
{
char buf[CMD_LINE];
cmd_t cmd[PIPE_MAX + 1];
int fd[PIPE_MAX][2];
int j, i;
int cmd_len, pipe_len;
pid_t pid;

while (1) {
printf("my_shell#");

fgets(buf, CMD_LINE, stdin);
buf[strlen(buf) - 1] = '\0';
cmd_len = parse_token(buf, cmd);

pipe_len = cmd_len - 1;
if (pipe_len > PIPE_MAX)
continue;

for (i = 0; i < pipe_len; ++i)
pipe(fd[i]);

for (i = 0; i < cmd_len; ++i)
if ((pid = fork()) == 0)
break;

if (pid == 0) {
if (pipe_len) {
if (i == 0) {
close(fd[i][0]);
p2(fd[i][1], 1);
close(fd[i][1]);
for (j = 1; j < pipe_len; ++j)
close(fd[j][0]),
close(fd[j][1]);
} else if (i == pipe_len) {
close(fd[i - 1][1]);
p2(fd[i - 1][0], 0);
close(fd[i - 1][0]);
for (j = 0; j < pipe_len - 1; ++j)
close(fd[j][0]),
close(fd[j][1]);
} else {
p2(fd[i - 1][0], 0);
close(fd[i][0]);
p2(fd[i][1], 1);
close(fd[i][1]);
for (j = 0; j < pipe_len; ++j) {
if ((j != i - 1)
|| (j != i))
close(fd[j][0]),
close(fd[j]
[1]);
}
}
}
if (cmd[i].in) {
int fd = open(cmd[i].in, O_RDONLY);
p2(fd, STDIN_FILENO);
close(fd);
}
if (cmd[i].out) {
int fd =
open(cmd[i].out,
O_RDWR | O_CREAT | O_TRUNC, 0644);
p2(fd, STDOUT_FILENO);
close(fd);
}
execvp(cmd[i].arg[0], cmd[i].arg);
fprintf(stderr, "Failed exec\n");
exit(127);
}
/* parent */
for (i = 0; i < pipe_len; ++i)
close(fd[i][0]), close(fd[i][1]);
for (i = 0; i < cmd_len; ++i)
wait(NULL);
}

return 0;
}

int parse_token(char *buf, cmd_t cmd[])
{
int n = 0;
#if 1
char *save_p;
char *p = strtok_r(buf, "|", &save_p);
while (p != NULL) {
parse(p, &cmd[n++]);
p = strtok_r(NULL, "|", &save_p);
}

#else
cmd[n].arg[0] = "ls";
cmd[n].arg[1] = "-l";
cmd[n].arg[2] = NULL;

#endif
return n;
}

int test_parse(cmd_t cmd[], int len)
{
int i;
for (i = 0; i < len; ++i) {
printf("cmd[%d]:", i);
int j = 0;
while (cmd[i].arg[j])
printf(" %s", cmd[i].arg[j++]);
if (cmd[i].in)
printf("\tin:%s", cmd[i].in);
if (cmd[i].out)
printf("\tout:%s", cmd[i].out);
printf("\n");
}
return 0;
}

int parse(char *buf, cmd_t * cmd)
{
int i = 0;
cmd->in = NULL;
cmd->out = NULL;
char *p = strtok(buf, " ");
while (p) {
if (*p == '<') {
if (*(p + 1))
cmd->in = p + 1;
else
cmd->in = strtok(NULL, " ");
} else if (*p == '>') {
if (*(p + 1))
cmd->out = p + 1;
else
cmd->out = strtok(NULL, " ");
} else
cmd->arg[i++] = p;
p = strtok(NULL, " ");
}
cmd->arg[i] = NULL;
return 0;
}

❽ 如何用C語言寫一個shell命令解釋器

支持的基本命令需求什麼?你要做個cmd這樣的來給你個1年估計都不夠~

❾ C語言是由什麼語言編寫而成的

我想,你問的是 C語言編譯器 是用什麼語言寫的。
概括說,當今幾乎所有的實用的編譯器/解釋器都是用C語言編寫的,有一些語言比如Clojure,Jython等是基於JVM或者說是用Java實現的,IronPython等是基.NET實現的,但是Java和C#等本身也要依靠C/C++來實現,等於是間接調用了C。
世界上第一個C語言編譯器,是在B語言基礎上,用B語言與PDP匯編語言 編寫的。開發過程是先用匯編寫了一個最基本功能的子集C0,利用自編譯Self-Compile功能,或虛擬機CVM(C Language Virtual Machine)功能,增添新的東西,變C1, 按此法多次增添發展,滾雪球般用匯編把小雪球揉到一起,1生2,2生3,...成了C。C 再生萬物。
這里,該向C語言之父Dennis Ritchie(丹尼斯·里奇)致敬。

❿ 求解釋代碼,有關用c語言寫一個簡單的shell解釋器的

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#define CMD_LINE 1024
#define PIPE_MAX 16
#define ARG_MAX 10
typedef struct {
char *arg[ARG_MAX];
char *in;
char *out;
} cmd_t;
extern int parse_token(char *buf, cmd_t cmd[]);
extern int parse(char *buf, cmd_t * cmd);
extern int test_parse(cmd_t cmd[], int len);
int main(int argc, char *argv[])
{
char buf[CMD_LINE];
cmd_t cmd[PIPE_MAX + 1];
int fd[PIPE_MAX][2];
int j, i;
int cmd_len, pipe_len;
pid_t pid;
while (1) {
printf("my_shell#"); //列印提示符

fgets(buf, CMD_LINE, stdin); //獲得輸入
buf[strlen(buf) - 1] = '' //去掉結尾的換行符?
cmd_len = parse_token(buf, cmd);//解析命令
pipe_len = cmd_len - 1; //
if (pipe_len > PIPE_MAX)
continue;
for (i = 0; i < pipe_len; ++i)
pipe(fd[i]); //創建pipe_len個管道
for (i = 0; i < cmd_len; ++i) //創建cmd_len個進程
if ((pid = fork()) == 0) //判斷是否為子進程
break; //如果是子進程,跳出for循環
if (pid == 0) { //循環中是子進程代碼
if (pipe_len) {
if (i == 0) { //第一個子進程
close(fd[i][0]); //關閉管道的讀取端
p2(fd[i][1], 1); //復制管理的寫入端為標准輸出(標准輸出會寫入管道)
close(fd[i][1]); //關閉管道的寫入端
for (j = 1; j < pipe_len; ++j)
close(fd[j][0]), //關閉無關進程的管道
close(fd[j][1]);
} else if (i == pipe_len) { //第pipe_len個子進程
close(fd[i - 1][1]); //關閉管道的寫入端
p2(fd[i - 1][0], 0); //復制管理的讀取端為標准輸出(標准輸入會讀取管道)
close(fd[i - 1][0]); //關閉管道的讀取端
for (j = 0; j < pipe_len - 1; ++j)
close(fd[j][0]), //關閉無關進程的管道
close(fd[j][1]);
} else { //其他子進程
p2(fd[i - 1][0], 0); //復制管理的讀取端為標准輸出(標准輸入會讀取管道)
close(fd[i][0]); //關閉管道的讀取端
p2(fd[i][1], 1); //復制管理的寫入端為標准輸出(標准輸出會寫入管道)
close(fd[i][1]); //關閉管道的寫入端
for (j = 0; j < pipe_len; ++j) {
if ((j != i - 1) //關閉無關進程的管道
|| (j != i))
close(fd[j][0]),
close(fd[j]
[1]);
}
}
}
if (cmd[i].in) { //如果需要,打開輸入文件並重定向
int fd = open(cmd[i].in, O_RDONLY);
p2(fd, STDIN_FILENO);
close(fd);
}
if (cmd[i].out) { //如果需要,打開輸出文件並重定向
int fd =
open(cmd[i].out,
O_RDWR | O_CREAT | O_TRUNC, 0644);
p2(fd, STDOUT_FILENO);
close(fd);
}
execvp(cmd[i].arg[0], cmd[i].arg); //執行當前命令
fprintf(stderr, "Failed exec "); //執行命令失敗後才會執行之後的代碼
exit(127);
} //子進程代碼結束
/* parent */
for (i = 0; i < pipe_len; ++i)
close(fd[i][0]), close(fd[i][1]);
for (i = 0; i < cmd_len; ++i)
wait(NULL); //等待子進程結束
}
return 0;
}
int parse_token(char *buf, cmd_t cmd[])
{
int n = 0;
#if 1
char *save_p;
char *p = strtok_r(buf, "|", &save_p);//以'|'分割命令將分割後的第一部分給p
while (p != NULL) {
parse(p, &cmd[n++]);
p = strtok_r(NULL, "|", &save_p);//將之後的部分給p,每次給一部分,每調用一次給下一部分
}
#else //下一塊語句不被執行
cmd[n].arg[0] = "ls";
cmd[n].arg[1] = "-l";
cmd[n].arg[2] = NULL;
#endif
return n;
}
int test_parse(cmd_t cmd[], int len) //此函數未被調用
{
int i;
for (i = 0; i < len; ++i) {
printf("cmd[%d]:", i);
int j = 0;
while (cmd[i].arg[j])
printf(" %s", cmd[i].arg[j++]);
if (cmd[i].in)
printf(" in:%s", cmd[i].in);
if (cmd[i].out)
printf(" out:%s", cmd[i].out);
printf(" ");
}
return 0;
}
int parse(char *buf, cmd_t * cmd)
{
int i = 0;
cmd->in = NULL;
cmd->out = NULL;
char *p = strtok(buf, " ");//以空格分割命令(此時命令已被|分割過了)
while (p) {
if (*p == '<') { //如果命令以<開頭,即需要做輸入重定向
if (*(p + 1)) //這種情況是<後無空格直接跟文件名
cmd->in = p + 1;
else //這種情況是<後有空格
cmd->in = strtok(NULL, " ");
} else if (*p == '>') { //如果命令以>開頭,即需要做輸出重定向
if (*(p + 1)) //這種情況是>後無空格直接跟文件名
cmd->out = p + 1;
else //這種情況是>後有空格
cmd->out = strtok(NULL, " ");
} else
cmd->arg[i++] = p; //這種情況是正常命令或參數
p = strtok(NULL, " ");
}
cmd->arg[i] = NULL;
return 0;
}