summary refs log tree commit diff stats
path: root/lib
Commit message (Expand)AuthorAgeFilesLines
...
* deinitializing locks at program exit (#19043)Tail Wag Games2021-10-252-24/+35
* Add Zephyr Support (#19003)Jaremy Creechley2021-10-2417-338/+508
* use the correct header for TIOCGWINSZ on Solaris (#19037)BarrOff2021-10-221-2/+5
* Add Elbrus 2000 architecture (#19024)Danil Yarantsev2021-10-211-1/+3
* Fix isInvalidFilename & always operate on the full passed in string (#19004)John Novak2021-10-201-45/+46
* bump NimVersion to 1.7.1narimiran2021-10-191-1/+1
* fix parsesql.treeRepr when nil is in input (#18974)Andrey Makarov2021-10-171-3/+3
* sequtils: fix errors from `strictFuncs` use (#18998)ee72021-10-161-3/+3
* fix a potential bug (#18900)flywind2021-10-141-1/+1
* remove deprecated stuffs from std/times (#18937)flywind2021-10-131-25/+25
* Removes deprecated {.injectStmt.}. Fixes #18666 (#18984)Dominik Picheta2021-10-131-10/+0
* Fixed `strictFuncs` support for `std/pegs` (#18951)quantimnot2021-10-071-138/+142
* typo [backport] (#18967)flywind2021-10-071-1/+1
* rst: minor fixes (#18960)Andrey Makarov2021-10-063-3/+4
* fixes #18954 (#18955)Andreas Rumpf2021-10-051-2/+2
* rename nimEnableHashRef [backport] (#18941)flywind2021-10-041-5/+13
* Add support for `strictEffects` to `std/pegs` (#18949)quantimnot2021-10-041-1/+4
* document -d:nimStrictDelete [backport] (#18939)flywind2021-10-031-0/+4
* with this patch :idx: can be used for the index generation for LaTeX (#18946)Andreas Rumpf2021-10-031-1/+1
* rename nimLegacyJsonutilsHoleyEnum [backport] (#18938)flywind2021-10-011-1/+5
* [std/tempfiles] docs improvement (#18936)flywind2021-10-011-5/+6
* correct licence header (#18935)flywind2021-10-015-5/+5
* [std/tasks] more gcsafe stuffs [backport] (#18926)flywind2021-09-301-3/+3
* Adds source to single tags list (#18920)Jonas Schubert Erlandsson2021-09-291-1/+1
* envPairs works in vm, nims (#18615)Timothee Cour2021-09-292-179/+189
* change comment (#18913)flywind2021-09-281-1/+1
* fixes #18878 (#18883)Aditya Siram2021-09-251-1/+2
* fix a typo (rename `temporal` to `temporary` (#18892) [backport]flywind2021-09-241-1/+1
* ported Nim to proprietary CrossOS [backport] (#18889)Andreas Rumpf2021-09-241-1/+1
* correct effect tracking for .borrowed procs [backport] (#18882)Andreas Rumpf2021-09-231-1/+1
* fix #18844 (#18851)flywind2021-09-201-4/+4
* fixes #18858 [backport] (#18868)Andreas Rumpf2021-09-193-3/+10
* [minor] fix docs (#18834)flywind2021-09-111-6/+4
* fix code-block which causes missing docsflywind2021-09-111-2/+2
* distros.foreignDeps made public (#18830)Juan Carlos2021-09-101-4/+4
* remove channels (#18801)flywind2021-09-041-498/+0
* fix for js strict mode (#18799)Sven Keller2021-09-041-4/+1
* we need something better than warningAsError for effect handling viol… (#18...Andreas Rumpf2021-09-041-2/+1
* Document `-d:async_backend` flag (#18700)Jacek Sieka2021-09-031-0/+28
* fixes #18494 (#18783)Andreas Rumpf2021-09-021-8/+34
* sequtils now support strict effect tracking (#18782)Andreas Rumpf2021-09-021-9/+14
* Fix initrand to avoid random number sequences overlapping (#18744)Tomohiro2021-09-022-16/+65
* strict effects (#18777)Andreas Rumpf2021-09-025-15/+25
* Fix #15150 (#18730)konsumlamm2021-08-311-1/+2
* add missing docs (#18758)flywind2021-08-291-0/+1
* Implement RFC-413 (#18749)Juan Carlos2021-08-262-4/+5
* fixes #14511 [backport:1.4] (#18732)Dankr4d2021-08-251-11/+10
* make deprecated message better (#18737)flywind2021-08-231-1/+1
* Fix #18718 (#18731)konsumlamm2021-08-231-5/+8
* Implement RFC-391 (#18585)Juan Carlos2021-08-221-107/+106
9a1fa41c0a244c3ce3409299d'>f02842a9 ^
0060093e ^





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
                                                                 
                        
                        







                                           
                              

                         



                                   
 
                                   
                                 





                                                                                           




                                                                   



                                                 
                                 


                                       
                                    
   
                               
                                                                                                 
           





                                                       
                                                              







                                                             
                                                              
 





                                                                                      
















                                                              

                                                    













































                                                                                                    





                                                 
             
   






                                 

























                                                    









                                                            





                                                           
// It's often convenient to express recipes in a textual fashion.
:(scenarios add_recipes)
:(scenario first_recipe)
recipe main [
  1:integer <- copy 23:literal
]
+parse: instruction: 1
+parse:   ingredient: {name: "23", type: 0}
+parse:   product: {name: "1", type: 1}

:(code)
int add_recipes(string form) {
  istringstream in(form);
  in >> std::noskipws;
  int result = add_recipe(in);
  while (!in.eof()) add_recipe(in);
  return result;
}

int add_recipe(istringstream& in) {
  skip_comments_and_newlines(in);
  string _recipe = next_word(in);
  if (_recipe != "recipe")
    raise << "top-level forms must be of the form 'recipe _name_ [ _instruction_ ... ]'\n";

  string recipe_name = next_word(in);
  if (recipe_name.empty())
    raise << "empty recipe name in " << in.str() << '\n';
  if (Recipe_number.find(recipe_name) == Recipe_number.end())
    Recipe_number[recipe_name] = Next_recipe_number++;
  int r = Recipe_number[recipe_name];
//?   cout << recipe_name << ": adding recipe " << r << '\n'; //? 2

  if (next_word(in) != "[")
    raise << "recipe body must begin with '['\n";

  skip_comments_and_newlines(in);

  instruction curr;
  while (next_instruction(in, &curr)) {
    Recipe[r].steps.push_back(curr);
  }
  Recipe[r].name = recipe_name;
//?   cout << "recipe " << recipe_name << " has " << Recipe[r].steps.size() << " steps.\n"; //? 1
  return r;
}

bool next_instruction(istream& in, instruction* curr) {
  curr->clear();
  if (in.eof()) return false;
  skip_whitespace(in);  if (in.eof()) return false;
  skip_comments_and_newlines(in);  if (in.eof()) return false;

  vector<string> words;
  while (in.peek() != '\n') {
    skip_whitespace(in);  if (in.eof()) return false;
    string word = next_word(in);  if (in.eof()) return false;
    words.push_back(word);
    skip_whitespace(in);  if (in.eof()) return false;
  }
  skip_comments_and_newlines(in);  if (in.eof()) return false;

//?   if (words.size() == 1) cout << words[0] << ' ' << words[0].size() << '\n'; //? 1
  if (words.size() == 1 && words[0] == "]") {
//?     cout << "AAA\n"; //? 1
    return false;  // end of recipe
  }

  if (words.size() == 1 && *(words[0].end()-1) == ':') {
    curr->is_label = true;
    words[0].erase(words[0].end()-1);
    curr->label = words[0];
    trace("parse") << "label: " << curr->label;
    return !in.eof();
  }

  vector<string>::iterator p = words.begin();
  if (find(words.begin(), words.end(), "<-") != words.end()) {
    for (; *p != "<-"; ++p) {
      if (*p == ",") continue;
      curr->products.push_back(reagent(*p));
    }
    ++p;  // skip <-
  }

  if (Recipe_number.find(*p) == Recipe_number.end())
    Recipe_number[*p] = Next_recipe_number++;
  curr->operation = Recipe_number[*p];  ++p;

  for (; p != words.end(); ++p) {
    if (*p == ",") continue;
    curr->ingredients.push_back(reagent(*p));
  }

  trace("parse") << "instruction: " << curr->operation;
  for (vector<reagent>::iterator p = curr->ingredients.begin(); p != curr->ingredients.end(); ++p) {
    trace("parse") << "  ingredient: " << p->to_string();
  }
  for (vector<reagent>::iterator p = curr->products.begin(); p != curr->products.end(); ++p) {
    trace("parse") << "  product: " << p->to_string();
  }
  return !in.eof();
}

string next_word(istream& in) {
  ostringstream out;
  skip_whitespace(in);
  slurp_word(in, out);
  return out.str();
}

void slurp_word(istream& in, ostream& out) {
  char c;
  if (in.peek() == ',') {
    in >> c;
    out << c;
    return;
  }
  while (in >> c) {
    if (isspace(c) || c == ',') {
      in.putback(c);
      break;
    }
    out << c;
  }
}

void skip_whitespace(istream& in) {
  while (isspace(in.peek()) && in.peek() != '\n') {
    in.get();
  }
}

void skip_comments_and_newlines(istream& in) {
  while (in.peek() == '\n' || in.peek() == '#') {
    if (in.peek() == '#') {
      in.get();
      while (in.peek() != '\n') in.get();
    }
    in.get();
  }
}

void skip_comma(istream& in) {
  skip_whitespace(in);
  if (in.peek() == ',') in.get();
  skip_whitespace(in);
}

:(scenario parse_label)
recipe main [
  foo:
]
+parse: label: foo
-parse: instruction: 1

:(scenario parse_multiple_products)
recipe main [
  1:integer, 2:integer <- copy 23:literal
]
+parse: instruction: 1
+parse:   ingredient: {name: "23", type: 0}
+parse:   product: {name: "1", type: 1}
+parse:   product: {name: "2", type: 1}

:(scenario parse_multiple_ingredients)
recipe main [
  1:integer, 2:integer <- copy 23:literal, 4:integer
]
+parse: instruction: 1
+parse:   ingredient: {name: "23", type: 0}
+parse:   ingredient: {name: "4", type: 1}
+parse:   product: {name: "1", type: 1}
+parse:   product: {name: "2", type: 1}

:(scenario parse_multiple_types)
recipe main [
  1:integer, 2:address:integer <- copy 23:literal, 4:integer
]
+parse: instruction: 1
+parse:   ingredient: {name: "23", type: 0}
+parse:   ingredient: {name: "4", type: 1}
+parse:   product: {name: "1", type: 1}
+parse:   product: {name: "2", type: 2-1}

:(scenario parse_properties)
recipe main [
  1:integer:address/deref <- copy 23:literal
]
+parse:   product: {name: "1", type: 1-2, property: deref:}