Changeset 8d422626 in OpenModelica
- Timestamp:
- 2021-04-06T08:31:39+02:00 (3 years ago)
- Branches:
- Added-citation-metadata, maintenance/v1.18, maintenance/v1.19, maintenance/v1.20, maintenance/v1.21, maintenance/v1.22, maintenance/v1.23, master, omlib-staging
- Children:
- 799136d7, d093f807, dc65bde2
- Parents:
- 4e6ee9f8
- git-author:
- Martin Sjölund <martin@…> (04/06/21 08:31:39)
- git-committer:
- GitHub <noreply@…> (04/06/21 08:31:39)
- Location:
- OMCompiler/Compiler/Lexers
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
OMCompiler/Compiler/Lexers/LexerJSON.mo
rae491c39 r8d422626 237 237 output list<Token> errorTokens={}; 238 238 protected 239 Integer startSt, numStates,i,r,cTok,cTok2,currSt,pos,sPos,ePos,linenr,contentLen,numBacktrack,buffer,lineNrStart;239 Integer startSt,i,r,cTok,cTok2,currSt,pos,sPos,ePos,linenr,contentLen,numBacktrack,buffer,lineNrStart; 240 240 list<Integer> cProg,cProg2; 241 241 list<String> chars; 242 array<Integer> states;242 list<Integer> states; 243 243 String s1,s2; 244 244 import MetaModelica.Dangerous.listReverseInPlace; … … 257 257 buffer := 0; 258 258 259 states := arrayCreate(128,1); 260 numStates := 1; 259 states := {}; 261 260 262 261 if (debug==true) then … … 274 273 while i <= contentLen loop 275 274 cTok := stringGet(contents,i); 276 (tokens,numBacktrack,startSt,currSt,pos,sPos,ePos,linenr,lineNrStart,buffer,states, numStates,errorTokens) := consume(cTok,tokens,contents,startSt,currSt,pos,sPos,ePos,linenr,lineNrStart,buffer,states,numStates,fileName,errorTokens);275 (tokens,numBacktrack,startSt,currSt,pos,sPos,ePos,linenr,lineNrStart,buffer,states,errorTokens) := consume(cTok,tokens,contents,startSt,currSt,pos,sPos,ePos,linenr,lineNrStart,buffer,states,fileName,errorTokens); 277 276 i := i - numBacktrack + 1; 278 277 end while; … … 288 287 input Integer currSt,pos,sPos,ePos,linenr,inLineNrStart; 289 288 input Integer inBuffer; 290 input array<Integer> inStates; 291 input Integer inNumStates; 289 input list<Integer> inStates; 292 290 input String fileName; 293 291 input list<Token> inErrorTokens; … … 297 295 output Integer mm_currSt,mm_pos,mm_sPos,mm_ePos,mm_linenr,lineNrStart; 298 296 output Integer buffer; 299 output array<Integer> states; 300 output Integer numStates; 297 output list<Integer> states; 301 298 output list<Token> errorTokens=inErrorTokens; 302 299 protected … … 314 311 buffer := inBuffer; 315 312 states := inStates; 316 numStates := inNumStates;317 313 318 314 baseCond := LexTable.yy_base[mm_currSt]; … … 352 348 mm_currSt := LexTable.yy_nxt[c]; 353 349 end if; 354 numStates := numStates+1; // TODO: BAD BAD BAD. At least arrayUpdate should be a safe operation... We need to grow the number of states on demand though. 355 arrayUpdate(states,numStates,mm_currSt); 350 states := mm_currSt::states; 356 351 357 352 baseCond := LexTable.yy_base[mm_currSt]; … … 361 356 end if; 362 357 363 (act, mm_currSt, mm_pos, mm_sPos, mm_linenr, buffer, bkBuffer, states , numStates) := findRule(fileContents, mm_currSt, mm_pos, mm_sPos, mm_ePos, mm_linenr, buffer, bkBuffer, states, numStates);358 (act, mm_currSt, mm_pos, mm_sPos, mm_linenr, buffer, bkBuffer, states) := findRule(fileContents, mm_currSt, mm_pos, mm_sPos, mm_ePos, mm_linenr, buffer, bkBuffer, states); 364 359 365 360 if (debug==true) then … … 374 369 375 370 mm_currSt := mm_startSt; 376 arrayUpdate(states,1,mm_startSt); 377 numStates := 1; 371 states := {}; 378 372 379 373 /* Either a token was output (get new positions for next token). Or a whitespace was emitted. */ … … 408 402 input Integer inBuffer; 409 403 input Integer inBkBuffer; 410 input array<Integer> inStates; 411 input Integer inNumStates; 404 input list<Integer> inStates; 412 405 output Integer action; 413 406 output Integer mm_currSt; … … 417 410 output Integer buffer; 418 411 output Integer bkBuffer; 419 output array<Integer> states; 420 output Integer numStates; 412 output list<Integer> states; 421 413 protected 422 414 array<Integer> mm_accept,mm_ec,mm_meta,mm_base,mm_def,mm_nxt,mm_chk,mm_acclist; 423 Integer lp,lp1,stCmp ;415 Integer lp,lp1,stCmp,cp; 424 416 Boolean st; 425 417 import arrayGet = MetaModelica.Dangerous.arrayGetNoBoundsChecking; // Bounds checked with debug=true … … 433 425 bkBuffer := inBkBuffer; 434 426 states := inStates; 435 numStates := inNumStates; 436 437 stCmp := arrayGet(states,numStates); 427 428 stCmp := listGet(states, 1); 438 429 lp := LexTable.yy_accept[stCmp]; 439 430 lp1 := LexTable.yy_accept[stCmp+1]; 440 431 441 432 st := intGt(lp,0) and intLt(lp,lp1); 442 (action, mm_currSt, mm_pos, mm_sPos, mm_linenr, buffer, bkBuffer, states, numStates) := match(numStates,st) 443 local 444 Integer act,cp; 445 list<Integer> restBuff; 446 case (_,true) 447 algorithm 448 if debug then 449 checkArrayModelica(LexTable.yy_accept,stCmp,sourceInfo()); 450 checkArrayModelica(LexTable.yy_acclist,lp,sourceInfo()); 451 end if; 452 lp := LexTable.yy_accept[stCmp]; 453 act := LexTable.yy_acclist[lp]; 454 then (act, mm_currSt, mm_pos, mm_sPos, mm_linenr, buffer, bkBuffer, states, numStates); 455 case (_,false) 456 algorithm 457 cp := stringGet(fileContents,mm_pos-1); 458 buffer := buffer-1; 459 bkBuffer := bkBuffer+1; 460 mm_pos := mm_pos - 1; 461 mm_sPos := mm_sPos -1; 462 if (cp==10) then 463 mm_sPos := mm_ePos; 464 mm_linenr := mm_linenr-1; 465 end if; 466 if debug then 467 checkArray(states,numStates,sourceInfo()); 468 end if; 469 mm_currSt := arrayGet(states,numStates); 470 numStates := numStates - 1; 471 (act, mm_currSt, mm_pos, mm_sPos, mm_linenr, buffer, bkBuffer, states, numStates) := findRule(fileContents, mm_currSt, mm_pos, mm_sPos, mm_ePos, mm_linenr, buffer, bkBuffer, states, numStates); 472 then (act, mm_currSt, mm_pos, mm_sPos, mm_linenr, buffer, bkBuffer, states, numStates); 473 474 end match; 433 if st then 434 if debug then 435 checkArrayModelica(LexTable.yy_accept,stCmp,sourceInfo()); 436 checkArrayModelica(LexTable.yy_acclist,lp,sourceInfo()); 437 end if; 438 lp := LexTable.yy_accept[stCmp]; 439 action := LexTable.yy_acclist[lp]; 440 else 441 cp := stringGet(fileContents,mm_pos-1); 442 buffer := buffer-1; 443 bkBuffer := bkBuffer+1; 444 mm_pos := mm_pos - 1; 445 mm_sPos := mm_sPos -1; 446 if (cp==10) then 447 mm_sPos := mm_ePos; 448 mm_linenr := mm_linenr-1; 449 end if; 450 mm_currSt::states := states; 451 (action, mm_currSt, mm_pos, mm_sPos, mm_linenr, buffer, bkBuffer, states) := findRule(fileContents, mm_currSt, mm_pos, mm_sPos, mm_ePos, mm_linenr, buffer, bkBuffer, states); 452 end if; 475 453 end findRule; 476 454 -
OMCompiler/Compiler/Lexers/lexerJSON.l
rae491c39 r8d422626 4 4 protected 5 5 import Error; 6 import StringUtil;7 6 public 8 7 %}
Note: See TracChangeset
for help on using the changeset viewer.