像linux、mysql、wps之类的著名软件都有多少行源代码啊?

像linux、mysql、wps之类的著名软件都有多少行源代码啊?,第1张

linux光内核的话已经有上千万行代码了,而linux的内核才不到100MB,整个系统即使是压缩在安装CD里也有六、七百MB,安装好后就有一、两个GB了,可以想像他需要多少行的代码了。

mysql,wps的源代码行数应该也不低于百万的数量级。

300行有点多,一般超过100行就要分模块了。你看这个行不?

#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

#include <string.h>

#define EMAX 101

char operator[]="()+-*/^"

char expr[EMAX]

struct stack_head {

struct stack_head *pre

}

struct opt_stack_node {

struct stack_head stack

char c

} *opt_topp = NULL/*The top of the operator stack*/

struct val_stack_node {

struct stack_head stack

long long val

} *val_topp = NULL/*The top of the value stack*/

void stack_push(void *toppp, void *newp)

void *stack_pop(void *toppp)

void opt_stack_push(char c)

char opt_stack_pop()

void val_stack_push(long long val)

long long val_stack_pop()

int isopt(char c)/*Check if character is a operator*/

/*The set of actions in each state with a given character*/

void action_0(int i)

void action_1(int i)

void action_2(int i)

void action_3(int i)

void action_4(int i)

void action_5(int i)

void action_6(int i)

void action_7(int i)

void action_8()

void input_expr()/*To input an expression*/

void stack_push(void *toppp, void *newp)

{

struct stack_head *temp = (struct stack_head *)newp

temp->pre = *(struct stack_head **)toppp

*(struct stack_head **)toppp = (struct stack_head *)newp

}

void * stack_pop(void *toppp)

{

struct stack_head *temp

if (*(struct stack_head **)toppp == NULL) {

printf("Linked stack is empty!\n")

exit(1)

}

temp = *(struct stack_head **)toppp

*(struct stack_head **)toppp = temp->pre

return (void *)temp

}

void stack_clear(void *toppp)

{

struct stack_head *temp

while (*(struct stack_head **)toppp!=NULL) {

temp = (*(struct stack_head **)toppp)->pre

free(*(struct stack_head **)toppp)

*(struct stack_head **)toppp = temp

}

}

void opt_stack_push(char c)

{

struct opt_stack_node *opt_nodep

= (struct opt_stack_node *)malloc(sizeof(struct opt_stack_node))

opt_nodep->c = c

stack_push(&opt_topp, opt_nodep)

}

char opt_stack_pop()

{

struct opt_stack_node *temp

= (struct opt_stack_node *)stack_pop(&opt_topp)

char c = temp->c

free(temp)

return c

}

void val_stack_push(long long val)

{

struct val_stack_node *val_nodep

= (struct val_stack_node *)malloc(sizeof(struct val_stack_node))

val_nodep->val = val

stack_push(&val_topp, val_nodep)

}

long long val_stack_pop()

{

struct val_stack_node *temp

= (struct val_stack_node *)stack_pop(&val_topp)

long long val = temp->val

free(temp)

return val

}

int isopt(char c)

{

if (strchr(operator,c) == NULL || c == '\0') {

return 0

} else {

return 1

}

}

int compute(long long i, char opt, long long j, long long *result)

{

long long prod = 1

switch (opt) {

case '+':

*result = i + j

return 0

case '-':

*result = i - j

return 0

case '*':

*result = i * j

return 0

case '/':

if (j == 0) {

printf(": Semantic Error: A divisor cannot be 0\n")

return 101

} else {

*result = i / j

return 0

}

case '^':

if (j >= 0) {

while (j >0) {

prod = prod * i

j--

}

*result = prod

return 0

} else if (i == 0) {

printf(": Semantic Error: "

"The power of 0 cannot be negative\n")

return 102

} else {

while (j >0) {

prod = prod / i

j--

}

*result = prod

return 0

}

default:

return 201

}

}

void action_0(int i)

{

char c = expr[i]

if (isspace(c)) {

action_0(++i)

} else if (isdigit(c)) {

action_1(i)

} else if (isopt(c) || c == '\0') {

switch (c) {

case '(':

opt_stack_push(c)

action_0(++i)

break

case '-':

opt_stack_push('_')

action_1(++i)

break

default:

printf(": Syntax Error:201\n")

}

} else {

printf(": Lexical Error:101 Unexpected character in input\n")

}

}

void action_1(int i)

{

char c = expr[i]

if (isdigit(c)) {

val_stack_push((long long)c - 48)

action_2(++i)

} else if (isopt(c) || c == '\0' || isspace(c)) {

switch (c) {

case '(':

opt_stack_push(c)

action_0(++i)

break

case '-':

opt_stack_push('_')

action_1(++i)

break

default:

printf(": Syntax Error:211\n")

}

} else {

printf(": Lexical Error:111 Unexpected character in input\n")

}

}

void action_2(int i)

{

char c = expr[i]

if (isdigit(c)) {

val_stack_push((long long)c - 48 + val_stack_pop() * 10)

action_2(++i)

} else if (isopt(c) || c == '\0' || isspace(c)) {

action_3(i)

} else {

printf(": Lexical Error:121 Unexpected character in input\n")

}

}

void action_3(int i)

{

char c = expr[i]

if (isspace(c)) {

action_3(++i)

} else if (isopt(c) || c == '\0' || isdigit(c)) {

switch (c) {

case '^':

action_4(i)

break

case '*':

case '/':

action_5(i)

break

case '+':

case '-':

action_6(i)

break

case ')':

action_7(i)

break

case '\0':

action_8()

break

default:

printf(": Syntax Error:231\n")

}

} else {

printf(": Lexical Error:131 Unexpected character in input\n")

}

}

void action_4(int i)

{

char c = expr[i]

char top_opt = opt_topp->c

switch (top_opt) {

case '+':

case '-':

case '(':

case '$':

case '*':

case '/':

case '^':

opt_stack_push(c)

action_0(++i)

break

case '_':

val_topp->val = -val_topp->val

opt_stack_pop()

action_4(i)

break

default:

printf(": Unexpected Error:341\n")

}

}

void action_5(int i)

{

char c = expr[i]

char top_opt = opt_topp->c

long long rs

long long left

long long right

switch (top_opt) {

case '+':

case '-':

case '(':

case '$':

opt_stack_push(c)

action_0(++i)

break

case '*':

case '/':

case '^':

right = val_stack_pop()

left = val_stack_pop()

if(compute(left, opt_stack_pop(), right, &rs)==0) {

val_stack_push(rs)

action_5(i)

}

break

case '_':

val_topp->val = -val_topp->val

opt_stack_pop()

action_5(i)

break

default:

printf(": Unexpected Error:351\n")

}

}

void action_6(int i)

{

char c = expr[i]

char top_opt = opt_topp->c

long long rs

long long left

long long right

switch (top_opt) {

case '(':

case '$':

opt_stack_push(c)

action_0(++i)

break

case '+':

case '-':

case '*':

case '/':

case '^':

right = val_stack_pop()

left = val_stack_pop()

if(compute(left, opt_stack_pop(), right, &rs)==0) {

val_stack_push(rs)

action_6(i)

}

break

case '_':

val_topp->val = -val_topp->val

opt_stack_pop()

action_6(i)

break

default:

printf(": Unexpected Error:361\n")

}

}

void action_7(int i)

{

char c = expr[i]

char top_opt = opt_topp->c

long long rs

long long left

long long right

switch (top_opt) {

case '(':

opt_stack_pop()

action_3(++i)

break

case '$':

printf(": Syntax Error:271 Unclosed parenthesis,"

" expect another ')'\n")

break

case '+':

case '-':

case '*':

case '/':

case '^':

right = val_stack_pop()

left = val_stack_pop()

if(compute(left, opt_stack_pop(), right, &rs)==0) {

val_stack_push(rs)

action_7(i)

}

break

case '_':

val_topp->val = -val_topp->val

opt_stack_pop()

action_7(i)

break

default:

printf(": Unexpected Error:371\n")

}

}

void action_8()

{

char top_opt = opt_topp->c

long long rs

long long left

long long right

switch (top_opt) {

case '(':

printf(": Syntax Error:281 Unclosed parenthesis,"

" expect another '('\n")

break

case '$':

printf("%lld\n",val_stack_pop())

break

case '+':

case '-':

case '*':

case '/':

case '^':

right = val_stack_pop()

left = val_stack_pop()

if(compute(left, opt_stack_pop(), right, &rs) == 0) {

val_stack_push(rs)

action_8()

}

break

case '_':

val_topp->val = -val_topp->val

opt_stack_pop()

action_8()

break

default:

printf(": Unexpected Error:381\n")

}

}

void input_expr()

{

scanf("%100[^\n]", expr)

while (getchar() != '\n') {}

}

int main()

{

printf("\nErGeCalculator version 1.0.2 (2012-10-15)\n"

"The maximum length of expression is 100 characters\n"

"Quit with 'q()'\n\n"

">")

input_expr()

while (strcmp(expr,"q()") != 0) {

stack_clear(&opt_topp)

stack_clear(&val_topp)

opt_stack_push('$')

action_0(0)

printf(">")

input_expr()

}

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7104423.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-01
下一篇 2023-04-01

发表评论

登录后才能评论

评论列表(0条)

保存