Added handling numerical states

This commit is contained in:
Abdelrahman Said 2023-06-17 18:44:30 +01:00
parent 43630526dc
commit b0e527ee76
3 changed files with 124 additions and 30 deletions

View File

@ -95,12 +95,12 @@
"-x", "-x",
"c", "c",
"-o", "-o",
"/tmp/main-759cce.o", "/tmp/main-d954cc.o",
"src/main.c" "src/main.c"
], ],
"directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json",
"file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/main.c", "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/main.c",
"output": "/tmp/main-759cce.o" "output": "/tmp/main-d954cc.o"
}, },
{ {
"arguments": [ "arguments": [
@ -162,11 +162,11 @@
"-x", "-x",
"c", "c",
"-o", "-o",
"/tmp/lexer_states-c32084.o", "/tmp/lexer_states-f7dff6.o",
"src/lexer/lexer_states.c" "src/lexer/lexer_states.c"
], ],
"directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json",
"file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/lexer_states.c", "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/lexer_states.c",
"output": "/tmp/lexer_states-c32084.o" "output": "/tmp/lexer_states-f7dff6.o"
} }
] ]

View File

@ -25,7 +25,6 @@ typedef enum {
// OBJECT STATES // OBJECT STATES
LEXER_STATE_KEY, LEXER_STATE_KEY,
// NUMBER STATES // NUMBER STATES
LEXER_STATE_NUMBER_START,
LEXER_STATE_DECIMAL, LEXER_STATE_DECIMAL,
LEXER_STATE_NUMBER, LEXER_STATE_NUMBER,
LEXER_STATE_FRACTION, LEXER_STATE_FRACTION,
@ -70,6 +69,13 @@ lexer_state_t handle_value(lexer_t *lexer, char input);
lexer_state_t handle_string(char input); lexer_state_t handle_string(char input);
lexer_state_t handle_string_end(lexer_t *lexer, char input); lexer_state_t handle_string_end(lexer_t *lexer, char input);
lexer_state_t handle_escape_sequence(char input); lexer_state_t handle_escape_sequence(char input);
lexer_state_t handle_decimal(char input);
lexer_state_t handle_number(lexer_t *lexer, char input);
lexer_state_t handle_fraction(lexer_t *lexer, char input);
lexer_state_t handle_exponent(char input);
lexer_state_t handle_exp_sign(char input);
lexer_state_t handle_power(lexer_t *lexer, char input);
lexer_state_t handle_number_end(lexer_t *lexer, char input);
bool validate_json(char *json) { bool validate_json(char *json) {
lexer_t lexer = {0}; lexer_t lexer = {0};
@ -144,21 +150,26 @@ void lexer_state_machine(lexer_t *lexer, char input) {
case LEXER_STATE_KEY: case LEXER_STATE_KEY:
lexer->current = handle_key(lexer); lexer->current = handle_key(lexer);
break; break;
case LEXER_STATE_NUMBER_START:
break;
case LEXER_STATE_DECIMAL: case LEXER_STATE_DECIMAL:
lexer->current = handle_decimal(input);
break; break;
case LEXER_STATE_NUMBER: case LEXER_STATE_NUMBER:
lexer->current = handle_number(lexer, input);
break; break;
case LEXER_STATE_FRACTION: case LEXER_STATE_FRACTION:
lexer->current = handle_fraction(lexer, input);
break; break;
case LEXER_STATE_EXPONENT: case LEXER_STATE_EXPONENT:
lexer->current = handle_exponent(input);
break; break;
case LEXER_STATE_EXP_SIGN: case LEXER_STATE_EXP_SIGN:
lexer->current = handle_exp_sign(input);
break; break;
case LEXER_STATE_POWER: case LEXER_STATE_POWER:
lexer->current = handle_power(lexer, input);
break; break;
case LEXER_STATE_NUMBER_END: case LEXER_STATE_NUMBER_END:
lexer->current = handle_number_end(lexer, input);
break; break;
case LEXER_STATE_STRING: case LEXER_STATE_STRING:
lexer->current = handle_string(input); lexer->current = handle_string(input);
@ -241,15 +252,11 @@ lexer_state_t handle_object(lexer_t *lexer, char input) {
lexer_state_t handle_array(lexer_t *lexer, char input) { lexer_state_t handle_array(lexer_t *lexer, char input) {
if (isspace(input)) { if (isspace(input)) {
return LEXER_STATE_ARRAY; return LEXER_STATE_ARRAY;
} else if (input == '"') {
stack_push(&(lexer->stack), LEXER_STATE_VALUE);
return LEXER_STATE_STRING;
} else if (input == ']') { } else if (input == ']') {
return handle_collection_end(lexer, input); return handle_collection_end(lexer, input);
} }
return LEXER_STATE_VALUE; return handle_value(lexer, input);
} }
lexer_state_t handle_key(lexer_t *lexer) { return LEXER_STATE_STRING; } lexer_state_t handle_key(lexer_t *lexer) { return LEXER_STATE_STRING; }
@ -257,6 +264,8 @@ lexer_state_t handle_key(lexer_t *lexer) { return LEXER_STATE_STRING; }
lexer_state_t handle_value(lexer_t *lexer, char input) { lexer_state_t handle_value(lexer_t *lexer, char input) {
if (isspace(input)) { if (isspace(input)) {
return LEXER_STATE_VALUE; return LEXER_STATE_VALUE;
} else if (isdigit(input) && input != '0') {
return LEXER_STATE_NUMBER;
} }
switch (input) { switch (input) {
@ -332,3 +341,88 @@ lexer_state_t handle_escape_sequence(char input) {
return LEXER_STATE_ERROR; return LEXER_STATE_ERROR;
} }
lexer_state_t handle_decimal(char input) {
if (input == '.') {
return LEXER_STATE_FRACTION;
}
return LEXER_STATE_ERROR;
}
lexer_state_t handle_number(lexer_t *lexer, char input) {
if (isdigit(input)) {
return LEXER_STATE_NUMBER;
} else if (input == '.') {
return LEXER_STATE_FRACTION;
} else if (input == '}' || input == ']') {
return handle_collection_end(lexer, input);
} else if (input == ',') {
return lexer->stack.stack[lexer->stack.size - 1];
} else if (isspace(input)) {
return LEXER_STATE_NUMBER_END;
}
return LEXER_STATE_ERROR;
}
lexer_state_t handle_fraction(lexer_t *lexer, char input) {
if (isdigit(input)) {
return LEXER_STATE_FRACTION;
} else if (input == '}' || input == ']') {
return handle_collection_end(lexer, input);
} else if (input == 'e' || input == 'E') {
return LEXER_STATE_EXPONENT;
} else if (input == ',') {
return lexer->stack.stack[lexer->stack.size - 1];
} else if (isspace(input)) {
return LEXER_STATE_NUMBER_END;
}
return LEXER_STATE_ERROR;
}
lexer_state_t handle_exponent(char input) {
if (isdigit(input)) {
return LEXER_STATE_POWER;
} else if (input == '+' || input == '-') {
return LEXER_STATE_EXP_SIGN;
}
return LEXER_STATE_ERROR;
}
lexer_state_t handle_exp_sign(char input) {
if (isdigit(input)) {
return LEXER_STATE_POWER;
}
return LEXER_STATE_ERROR;
}
lexer_state_t handle_power(lexer_t *lexer, char input) {
if (isdigit(input)) {
return LEXER_STATE_POWER;
} else if (input == '}' || input == ']') {
return handle_collection_end(lexer, input);
} else if (input == ',') {
return lexer->stack.stack[lexer->stack.size - 1];
} else if (isspace(input)) {
return LEXER_STATE_NUMBER_END;
}
return LEXER_STATE_ERROR;
}
lexer_state_t handle_number_end(lexer_t *lexer, char input) {
if (isspace(input)) {
return LEXER_STATE_NUMBER_END;
} else if (input == ',') {
return lexer->stack.stack[lexer->stack.size - 1];
}
bool collection_end = input == '}' || input == ']';
return collection_end ? handle_collection_end(lexer, input)
: LEXER_STATE_ERROR;
}

View File

@ -19,16 +19,16 @@
"useJSP": "false", "useJSP": "false",
"jspListTemplate": "listTemplate.jsp", "jspListTemplate": "listTemplate.jsp",
"jspFileTemplate": "articleTemplate.jsp", "jspFileTemplate": "articleTemplate.jsp",
"cachePackageTagsTrack": "200", "cachePackageTagsTrack": 200,
"cachePackageTagsStore": "200", "cachePackageTagsStore": 200,
"cachePackageTagsRefresh": "60", "cachePackageTagsRefresh": 60,
"cacheTemplatesTrack": "100", "cacheTemplatesTrack": 100,
"cacheTemplatesStore": "50", "cacheTemplatesStore": 50,
"cacheTemplatesRefresh": "15", "cacheTemplatesRefresh": 15,
"cachePagesTrack": "200", "cachePagesTrack": 200,
"cachePagesStore": "100", "cachePagesStore": 100,
"cachePagesRefresh": "10", "cachePagesRefresh": 10,
"cachePagesDirtyRead": "10", "cachePagesDirtyRead": 10,
"searchEngineListTemplate": "forSearchEnginesList.htm", "searchEngineListTemplate": "forSearchEnginesList.htm",
"searchEngineFileTemplate": "forSearchEngines.htm", "searchEngineFileTemplate": "forSearchEngines.htm",
"searchEngineRobotsDb": "WEB-INF/robots.db", "searchEngineRobotsDb": "WEB-INF/robots.db",
@ -42,11 +42,11 @@
"dataStorePassword": "dataStoreTestQuery", "dataStorePassword": "dataStoreTestQuery",
"dataStoreTestQuery": "SET NOCOUNT ON;select test='test';", "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';",
"dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log", "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log",
"dataStoreInitConns": "10", "dataStoreInitConns": 10,
"dataStoreMaxConns": "100", "dataStoreMaxConns": 100,
"dataStoreConnUsageLimit": "100", "dataStoreConnUsageLimit": 100,
"dataStoreLogLevel": "debug", "dataStoreLogLevel": "debug",
"maxUrlLength": "500" "maxUrlLength": 500
} }
}, },
{ {
@ -70,17 +70,17 @@
"servlet-class": "org.cofax.cms.CofaxToolsServlet", "servlet-class": "org.cofax.cms.CofaxToolsServlet",
"init-param": { "init-param": {
"templatePath": "toolstemplates/", "templatePath": "toolstemplates/",
"log": "1", "log": 1,
"logLocation": "/usr/local/tomcat/logs/CofaxTools.log", "logLocation": "/usr/local/tomcat/logs/CofaxTools.log",
"logMaxSize": "", "logMaxSize": "",
"dataLog": "1", "dataLog": 1,
"dataLogLocation": "/usr/local/tomcat/logs/dataLog.log", "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log",
"dataLogMaxSize": "", "dataLogMaxSize": "",
"removePageCache": "/content/admin/remove?cache=pages&id=", "removePageCache": "/content/admin/remove?cache=pages&id=",
"removeTemplateCache": "/content/admin/remove?cache=templates&id=", "removeTemplateCache": "/content/admin/remove?cache=templates&id=",
"fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder", "fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder",
"lookInContext": "1", "lookInContext": 1,
"adminGroupID": "4", "adminGroupID": 4,
"betaServer": "true" "betaServer": "true"
} }
} }