Forum: Mitt scriptspråk Sigma

Forum huvudsida -> Programmering -> Mitt scriptspråk Sigma

Sidor: 1

Till botten

44pixels 20:17 - 4:e April 2007 | Post #1
Medlem
Inlägg: 24


Skicka PM
Ja, det börjar ju nästan bli lite av en trend att skapa sitt eget språk. Jag håller på med ett. Men jag är lite osäker på syntaxen. Efterssom jag har jobbat så lite på det så kan jag snabbt ändra syntaxen. Just nu ser det ut så här:

  1. SAY ("Hello World!")
  2. PAUSE
  3. SAY ("Hello World!")
  4. KEY_WAIT
  5. CLEAR_SCREEN


Själv vet jag inte riktigt om jag gillar syntaxen. Men som sagt. Kom med tips! Just nu är det för mycket, typ, Basic över det hela.

[Edit: Typ, glömde "]


Senast redigerad 19:38 - 6:e April 2007


jockepockee 20:34 - 4:e April 2007 | Post #2
Medlem
Inlägg: 192


Skicka PM
i systemfunktionen "SAY" om du ska skriva ut en text så kan du lägga till " och " för att man ka veta att de är text man skriver ut och inte en variavbel.

-------------------------





44pixels 20:37 - 4:e April 2007 | Post #3
Medlem
Inlägg: 24


Skicka PM
Ok, men för övrigt? Ska jag ändra syntaxen totalt?




jockepockee 20:50 - 4:e April 2007 | Post #4
Medlem
Inlägg: 192


Skicka PM
vad ska skriptspråket ha för användningsområde?

-------------------------





44pixels 20:51 - 4:e April 2007 | Post #5
Medlem
Inlägg: 24


Skicka PM
Just nu är inte mycket planerat. Men mest lite grundläggande saker till att börja med.




jockepockee 20:57 - 4:e April 2007 | Post #6
Medlem
Inlägg: 192


Skicka PM
ok men några saker som du skulle kunna ha i språket är:

- input och output
- varibler (t ex heltal,decimaltal,strängar)
- funktioner
- filhantering
- klasser (om du vill)
- inkudering av bibliotek för olika användnings områden

+ lite till

-------------------------





44pixels 21:01 - 4:e April 2007 | Post #7
Medlem
Inlägg: 24


Skicka PM
Just nu jobbar jag på variabler. Kommer sedan fixa så att man kan köra typ SAY ("text" . var . "text").

Men variabler kräver ju lite arbete.




main 14:17 - 6:e April 2007 | Post #8
Medlem
Inlägg: 40


Skicka PM
De stora frågorna är vem som skall använda språket och till vad.

-------------------------
- Real programmers code in binary



kron 19:40 - 23:e April 2007 | Post #9
Medlem
Inlägg: 1


Skicka PM
Hur gör man ett eget script-språk?




derfian 20:06 - 23:e April 2007 | Post #10
Medlem
Inlägg: 149


Skicka PM
Det enkla sättet är att man skriver ett program (tolk) som läser ett script och "översätter" script-instruktioner till vad-man-nu-kodar-tolken i för något språk.

Det avancerade sättet är att man gör samma sak, fast man dokumenterar och specificerar sitt språk.


Senast redigerad 20:08 - 23:e April 2007


Slash 20:32 - 23:e April 2007 | Post #11
Medlem
Inlägg: 141


Skicka PM
    Citat av kron:
Hur gör man ett eget script-språk?


,,r väl inget man skriver ihop i en handvändning direkt. I vanliga fall så byggs någon typ av intern representation upp från en textfil, denna fas kallas lexning och parsning. Den interna representationen brukar vara en typ av träd som fås från parsningen. Efter det så måste det typkollas så att det stämmer, sedan kan man exekvera koden direkt i som trädsrepresantionen eller generera någon form av byte-code.

Så om strängen "sum = 5*(multiplier + 1);" ska parsas så går den först genom lexern och blir så kallades tokens. Exempel på en tokensträng för strängen är:

  1. [sum] [=] [5] [*] [(] [multiplier] [+] [1] [)] [;]


Sedan byggs ett parseträd upp från dessa tokens:

  1. [=]
  2. / \
  3. [sum] [*]
  4. / \
  5. [5] [+]
  6. / \
  7. [multiplier] [1]


Som kan läsas "'sum' tilldelas värdet av en multiplikation mellan 5 och en addition mellan 'multiplier' och 1". Observera att trädet byggs inte upp av tokens utan bara utifrån tokens, d.v.s. [+]-token kanske representeras av en klass som heter BinaryOperation och tar en operator och två operander.

Sedan är det bara att exekvera rooten i trädet. Vid själva implementationen tillkommer det problem med symboltabeller, variabler och dylikt som måste lösas.

Detta är ju en ganska generell lösning, skriver man ett litet och enkelt skriptspråk så kan det ju hända att man kommer lindrigare undan, men tradionellt är det liknande såhär det görs.

-------------------------
Ingen sigantur!



sdac 00:19 - 24:e April 2007 | Post #12
Medlem
Inlägg: 235


Skicka PM
    Citat av 44pixels:


  1. SAY ("Hello World!")
  2. PAUSE
  3. SAY ("Hello World!")
  4. KEY_WAIT
  5. CLEAR_SCREEN


Själv vet jag inte riktigt om jag gillar syntaxen. Men som sagt. Kom med tips! Just nu är det för mycket, typ, Basic över det hela.


Verkar oerhört onödigt att skapa ett syntax man själv inte trivs med.

    Citat av kron:

Hur gör man ett eget script-språk?

    Citat av Slash:

,,r väl inget man skriver ihop i en handvändning direkt.


Joho, man använder såklart C-preprocessorn.

/usr/include/sigma.h
  1. #include <stdio.h>
  2. #define SAY(x) puts(x "n");
  3. #define PAUSE sleep(1);
  4. #define KEY_WAIT getchar();
  5. #define CLEAR_SCREEN
  6. #define START int main(void){
  7. #define END return 0;}


test.sig
  1. START
  2. SAY("sdfghjk")
  3. PAUSE
  4. SAY("kjhgfds")
  5. KEY_WAIT
  6. CLEAR_SCREEN
  7. END


/usr/bin/sigmake
  1. echo "#include <sigma.h>" > tmp.c;
  2. cat $1 >> tmp.c;
  3. gcc tmp.c -o $1.out


Sen för att kompilera och köra:
sigmake test.sig
./test.sig.out

Varför lägga massa tid på att skriva en interpreterare/kompilator, när det redan finns C-preprocesseraren?Smiley

Min poäng är att det är ganska onödigt att skapa ett nytt språk som gör samma sak som alla andra men på ett lite annorlunda sätt i syntaxet. Sen tror jag inte att det blir så trevligt i längden med samtliga tecken som versaler heller. Kom istället på en idé och något innovativt, och skapa det, tänk förbi objektorientering och inventera nästa steg?


Senast redigerad 00:23 - 24:e April 2007


derfian 01:34 - 24:e April 2007 | Post #13
Medlem
Inlägg: 149


Skicka PM
Varför lägga massa tid på att skriva en interpreterare/kompilator, när det redan finns C-preprocesseraren?


Men ett scriptspråk skall väl per definition inte behöva kompileras?

Jag kompletterar med vad jag skrev under en kort tids inspiration. Det kanske kan inspirera någon.
Ja, det finns (rätt stora) brister, och ja, det skulle behöva en hel del jobb.
  1. /*
  2. * Sigma Scripting Language Parser
  3. * Author: Karl Mikaelsson
  4. * Date: 070402
  5. */
  6. #include <iostream>
  7. #include <sstream>
  8. #include <map>
  9. #include <fstream>
  10. #include <string>
  11. #include <queue>
  12. using namespace std;
  13. /*
  14. * Data structures
  15. */
  16. enum sigma_opcode
  17. {
  18. SIGMA_ILLEGAL_INSTRUCTION,
  19. SIGMA_PRINT,
  20. SIGMA_LOAD,
  21. SIGMA_STORE,
  22. SIGMA_ADD,
  23. SIGMA_SUB,
  24. SIGMA_MUL,
  25. SIGMA_DIV,
  26. SIGMA_EXIT
  27. };
  28. map<const string, const sigma_opcode> SIGMA_TRANSLATION_TABLE;
  29. struct sigma_instruction
  30. {
  31. sigma_opcode type;
  32. queue<string> arguments;
  33. };
  34. template<typename T>
  35. struct sigma_variable
  36. {
  37. string name;
  38. T value;
  39. };
  40. /*
  41. * Function implementations
  42. */
  43. void sigma_print(string out);
  44. template<typename T>
  45. int sigma_load(string name, T value);
  46. template<typename T>
  47. T sigma_store(string name, T value);
  48. void sigma_exit(int status);
  49. /*
  50. * Internal helper functions
  51. */
  52. sigma_instruction* sigma_translate_instruction(string instruction);
  53. void sigma_parse(istream& is);
  54. string sigma_readline(istream& is);
  55. int sigma_execute(sigma_instruction* i);
  56. void sigma_error(sigma_instruction* i, int rval);
  57. sigma_opcode sigma_string_to_opcode(string str);
  58. /*
  59. * Main loop
  60. */
  61. int main(int argc, char *argv)
  62. {
  63. /*
  64. * Populate translation map
  65. */
  66. SIGMA_TRANSLATION_TABLE.insert(make_pair("PRINT",SIGMA_PRINT));
  67. // SIGMA_TRANSLATION_TABLE.insert(make_pair("LOAD",SIGMA_LOAD));
  68. // SIGMA_TRANSLATION_TABLE.insert(make_pair("STORE", SIGMA_STORE));
  69. SIGMA_TRANSLATION_TABLE.insert(make_pair("EXIT", SIGMA_EXIT));
  70. /*
  71. * Read from file
  72. */
  73. /*
  74. * Read from stdin
  75. */
  76. sigma_parse(cin);
  77. return 0;
  78. }
  79. /*
  80. * Print contents of out to stdout.
  81. */
  82. void sigma_print(string out)
  83. {
  84. cout << out;
  85. return;
  86. }
  87. /*
  88. * Read and execute instructions from is
  89. */
  90. void sigma_parse(istream& is)
  91. {
  92. sigma_instruction* i;
  93. string read_instr;
  94. int rval;
  95. while (is)
  96. {
  97. read_instr = sigma_readline(is);
  98. i = sigma_translate_instruction(read_instr);
  99. rval = sigma_execute(i);
  100. if (rval != 0)
  101. {
  102. sigma_error(i,rval);
  103. break;
  104. }
  105. };
  106. return;
  107. }
  108. /*
  109. * Read and return one line
  110. */
  111. string sigma_readline(istream& is)
  112. {
  113. string tmp;
  114. getline(is, tmp);
  115. return tmp;
  116. }
  117. /*
  118. * Return a instruction string, stripped of comments.
  119. */
  120. string sigma_strip_comments(string in)
  121. {
  122. unsigned int cpos = in.find(";");
  123. if (cpos == string::npos)
  124. {
  125. return in;
  126. }
  127. else
  128. {
  129. return in.substr(0,cpos);
  130. }
  131. return 0;
  132. }
  133. /*
  134. * Execute an instruction.
  135. */
  136. int sigma_execute(sigma_instruction* instruction)
  137. {
  138. /*
  139. * Look at the instruction and call appropriate
  140. * function
  141. */
  142. if (instruction == 0)
  143. {
  144. return 0;
  145. }
  146. string arg;
  147. switch (instruction->type)
  148. {
  149. case SIGMA_PRINT:
  150. while (!instruction->arguments.empty())
  151. {
  152. arg = instruction->arguments.front();
  153. sigma_print(arg);
  154. instruction->arguments.pop();
  155. }
  156. sigma_print("n");
  157. break;
  158. case SIGMA_LOAD:
  159. cout << "load" << endl;
  160. break;
  161. case SIGMA_STORE:
  162. cout << "store" << endl;
  163. break;
  164. case SIGMA_EXIT:
  165. cout << "exit" << endl;
  166. delete instruction;
  167. return 1;
  168. break;
  169. case SIGMA_ILLEGAL_INSTRUCTION:
  170. default:
  171. cout << "Illegal instruction" << endl;
  172. delete instruction;
  173. return -1;
  174. break;
  175. }
  176. delete instruction;
  177. return 0;
  178. }
  179. /*
  180. * Print an error message, given a return code and instruction
  181. */
  182. void sigma_error(sigma_instruction* i, int rval)
  183. {
  184. // cout << SIGMA_ERROR_MESSAGE[inst.instruction_type][];
  185. };
  186. /*
  187. * Translate string into sigma_instruction*
  188. */
  189. sigma_instruction* sigma_translate_instruction(string instruction)
  190. {
  191. /*
  192. * Strip comments from the string.
  193. * If the string is empty, return 0.
  194. */
  195. string i;
  196. i = sigma_strip_comments(instruction);
  197. if (i.length() == 0)
  198. {
  199. return 0;
  200. }
  201. sigma_instruction* si = new sigma_instruction;
  202. /*
  203. * Split into function and arguments
  204. */
  205. istringstream inst_line(i);
  206. string inst;
  207. inst_line >> inst;
  208. while (inst_line)
  209. {
  210. string tmp;
  211. inst_line >> tmp;
  212. si->arguments.push(tmp);
  213. }
  214. si->type = sigma_string_to_opcode(inst);
  215. return si;
  216. };
  217. /*
  218. * Translate string instruction to opcode
  219. */
  220. sigma_opcode sigma_string_to_opcode(string str)
  221. {
  222. /*
  223. * Look up opcode in string->opcode map
  224. */
  225. map<const string,const sigma_opcode>::iterator i = SIGMA_TRANSLATION_TABLE.find(str);
  226. if (i != SIGMA_TRANSLATION_TABLE.end())
  227. {
  228. return i->second;
  229. }
  230. return SIGMA_ILLEGAL_INSTRUCTION;
  231. }


Alla roliga problem finns fortfarande kvar att lösa. :->


Senast redigerad 01:36 - 24:e April 2007


sdac 01:55 - 24:e April 2007 | Post #14
Medlem
Inlägg: 235


Skicka PM
    Citat av derfian:

Men ett scriptspråk skall väl per definition inte behöva kompileras?


Det var ju precis därför jag skrev "interpreterare/kompilator".




derfian 02:18 - 24:e April 2007 | Post #15
Medlem
Inlägg: 149


Skicka PM
    Citat av sdac:
    Citat av derfian:

Men ett scriptspråk skall väl per definition inte behöva kompileras?


Det var ju precis därför jag skrev "interpreterare/kompilator".


Men det du föreslog innebär att man använder en kompilator.




sdac 02:32 - 24:e April 2007 | Post #16
Medlem
Inlägg: 235


Skicka PM
    Citat av derfian:
    Citat av sdac:
    Citat av derfian:

Men ett scriptspråk skall väl per definition inte behöva kompileras?


Det var ju precis därför jag skrev "interpreterare/kompilator".


Men det du föreslog innebär att man använder en kompilator.


Korrekt iakttagelse, jag föreslog att man kunde använda C-preprocesseraren istället för en kompilator eller en interpreterare för att den var tillräckligt kapabel. Sen var det ju lite sarkasm över det hela också.Smiley


Senast redigerad 02:33 - 24:e April 2007


derfian 12:07 - 24:e April 2007 | Post #17
Medlem
Inlägg: 149


Skicka PM
ESARCASMDETECTIONUNITBROKEN :-(




Sidor: 1

Forum huvudsida -> Programmering -> Mitt scriptspråk Sigma
Atom feed

Du får inte posta i den här tråden | Till toppen