60 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
60 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
61 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
61 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
62 OTHER DEALINGS IN THE SOFTWARE. |
62 OTHER DEALINGS IN THE SOFTWARE. |
63 " |
63 " |
64 ! ! |
64 ! ! |
|
65 |
65 |
66 |
66 !SyntaxHighlighter2 class methodsFor:'highlighting'! |
67 !SyntaxHighlighter2 class methodsFor:'highlighting'! |
67 |
68 |
68 formatClassDefinition:aString in:aClass elementsInto: elements |
69 formatClassDefinition:aString in:aClass elementsInto: elements |
69 "format (recolor) a class definition expression in a given class. |
70 "format (recolor) a class definition expression in a given class. |
242 |
245 |
243 "Created: / 14-02-2010 / 13:08:27 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
246 "Created: / 14-02-2010 / 13:08:27 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
244 "Modified: / 21-08-2011 / 09:37:35 / cg" |
247 "Modified: / 21-08-2011 / 09:37:35 / cg" |
245 "Modified: / 16-02-2012 / 09:59:58 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
248 "Modified: / 16-02-2012 / 09:59:58 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
246 ! ! |
249 ! ! |
|
250 |
247 |
251 |
248 !SyntaxHighlighter2 methodsFor:'parsing-expressions'! |
252 !SyntaxHighlighter2 methodsFor:'parsing-expressions'! |
249 |
253 |
250 _binaryExpressionFor:receiverArg |
254 _binaryExpressionFor:receiverArg |
251 "parse a binary-expression; return a node-tree, nil or #Error" |
255 "parse a binary-expression; return a node-tree, nil or #Error" |
540 |
544 |
541 "Modified: / 19-01-2000 / 16:22:16 / cg" |
545 "Modified: / 19-01-2000 / 16:22:16 / cg" |
542 "Created: / 16-02-2012 / 21:56:51 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
546 "Created: / 16-02-2012 / 21:56:51 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
543 ! |
547 ! |
544 |
548 |
|
549 binaryExpressionFor:receiverArg |
|
550 "parse a binary-expression; return a node-tree, nil or #Error" |
|
551 |
|
552 |receiver expr arg sel pos1 pos2 lno| |
|
553 |
|
554 receiver := receiverArg. |
|
555 (receiver == #Error) ifTrue:[^ #Error]. |
|
556 |
|
557 "special kludge: since Scanner cannot know if -digit is a binary |
|
558 expression or a negative constant, handle cases here" |
|
559 |
|
560 [(tokenType == #BinaryOperator) |
|
561 or:[(tokenType == $|) |
|
562 or:[(tokenType == $^ and:[parserFlags allowCaretAsBinop]) |
|
563 or:[((tokenType == #Integer) or:[tokenType == #Float]) |
|
564 and:[tokenValue < 0]]]] |
|
565 ] whileTrue:[ |
|
566 "/ kludge alarm: in a function-call argList, #, is not a binarySelector |
|
567 inFunctionCallArgument == true ifTrue:[ |
|
568 ((tokenType == #BinaryOperator) and:[tokenName = ',']) ifTrue:[ |
|
569 ^ receiver |
|
570 ]. |
|
571 ]. |
|
572 |
|
573 pos1 := tokenPosition. |
|
574 lno := tokenLineNr. |
|
575 |
|
576 "/ kludge alarm: bar, caret and minus are not scanned as binop |
|
577 (tokenType == $|) ifTrue:[ |
|
578 sel := '|'. |
|
579 sel := self selectorCheck:sel for:receiver position:tokenPosition to:tokenPosition. |
|
580 self nextToken. |
|
581 ] ifFalse:[ |
|
582 (tokenType == $^) ifTrue:[ |
|
583 sel := '^'. |
|
584 sel := self selectorCheck:sel for:receiver position:tokenPosition to:tokenPosition. |
|
585 self nextToken. |
|
586 ] ifFalse:[ |
|
587 (tokenType == #BinaryOperator) ifTrue:[ |
|
588 sel := tokenName. |
|
589 sel := self selectorCheck:sel for:receiver position:tokenPosition to:(tokenPosition + tokenName size - 1). |
|
590 self nextToken |
|
591 ] ifFalse:[ |
|
592 sel := '-'. |
|
593 token := tokenValue := tokenValue negated. |
|
594 tokenPosition := tokenPosition + 1. "/ to skip the sign |
|
595 ] |
|
596 ]. |
|
597 ]. |
|
598 |
|
599 pos2 := pos1 + sel size - 1. |
|
600 self markSelector:sel from:pos1 to:pos2 receiverNode:receiver. |
|
601 lastSelectorElement := nil. |
|
602 |
|
603 arg := self unaryExpression. |
|
604 (arg == #Error) ifTrue:[^ #Error]. |
|
605 |
|
606 expr := BinaryNode receiver:receiver selector:sel arg:arg fold:foldConstants. |
|
607 expr isErrorNode ifTrue:[ |
|
608 self parseError:(expr errorString) position:pos1 to:tokenPosition. |
|
609 errorFlag := false. "ok, user wants it - so he'll get it" |
|
610 expr := BinaryNode receiver:receiver selector:sel arg:arg fold:nil. |
|
611 ]. |
|
612 expr lineNumber:lno. |
|
613 expr selectorPosition:pos1. |
|
614 |
|
615 self checkPlausibilityOf:expr from:pos1 to:pos2. |
|
616 receiver := expr. "/ for next message |
|
617 ]. |
|
618 ^ receiver |
|
619 |
|
620 "Modified: / 09-01-1998 / 19:05:18 / stefan" |
|
621 "Modified: / 14-02-2010 / 17:54:53 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
622 "Modified: / 19-01-2012 / 10:46:49 / cg" |
|
623 ! |
|
624 |
545 expression |
625 expression |
546 | node savedLastSelectorElement | |
626 | node savedLastSelectorElement | |
547 |
627 |
548 savedLastSelectorElement := lastSelectorElement. |
628 savedLastSelectorElement := lastSelectorElement. |
549 lastSelectorElement := nil. |
629 lastSelectorElement := nil. |
558 ^node |
638 ^node |
559 |
639 |
560 "Modified: / 19-01-2000 / 16:22:16 / cg" |
640 "Modified: / 19-01-2000 / 16:22:16 / cg" |
561 "Modified: / 16-02-2012 / 23:39:15 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
641 "Modified: / 16-02-2012 / 23:39:15 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
562 ! |
642 ! |
|
643 |
|
644 |
563 |
645 |
564 unaryExpressionFor:receiverArg |
646 unaryExpressionFor:receiverArg |
565 "parse a unary-expression; return a node-tree, nil or #Error" |
647 "parse a unary-expression; return a node-tree, nil or #Error" |
566 |
648 |
567 |receiver expr sel pos pos2 lNr arguments savedLastSelectorElement| |
649 |receiver expr sel pos pos2 lNr arguments savedLastSelectorElement| |
722 "Created: / 14-02-2010 / 17:40:09 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
801 "Created: / 14-02-2010 / 17:40:09 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
723 "Modified (format): / 21-08-2011 / 09:18:21 / cg" |
802 "Modified (format): / 21-08-2011 / 09:18:21 / cg" |
724 "Modified: / 19-04-2012 / 09:53:59 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
803 "Modified: / 19-04-2012 / 09:53:59 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
725 ! |
804 ! |
726 |
805 |
|
806 |
|
807 |
727 markUnknownIdentifierFrom:pos1 to:pos2 |
808 markUnknownIdentifierFrom:pos1 to:pos2 |
728 |
809 |
729 ignoreBadIdentifier == true ifTrue:[ ^ self ]. |
810 ignoreBadIdentifier == true ifTrue:[ ^ self ]. |
730 |
811 |
731 super markUnknownIdentifierFrom:pos1 to:pos2 |
812 super markUnknownIdentifierFrom:pos1 to:pos2 |
732 |
813 |
733 "Created: / 31.3.1998 / 19:09:26 / cg" |
814 "Created: / 31.3.1998 / 19:09:26 / cg" |
734 "Modified: / 31.3.1998 / 19:10:30 / cg" |
815 "Modified: / 31.3.1998 / 19:10:30 / cg" |
735 ! |
816 ! |
736 |
817 |
|
818 |
|
819 |
737 rememberVariableElementFor:name type:typeSymbol from:pos1 to:pos2 |
820 rememberVariableElementFor:name type:typeSymbol from:pos1 to:pos2 |
738 |element prev| |
821 |element prev| |
739 |
822 |
740 prev := lastVariableElements at:name ifAbsent:[nil]. |
823 prev := lastVariableElements at:name ifAbsent:[nil]. |
741 (prev notNil and:[prev start == pos1]) ifTrue:[^ self]. |
824 (prev notNil and:[prev start == pos1]) ifTrue:[^ self]. |