Alternatively, join us on Discord.

+-Recent Topics

[ti-83+/84+]Finding missing ends in tibasic [web][ti-basic] [javascript]

Started by c4ooo, October 26, 2015, 02:33:15 am

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

c4ooo

On par with @123outerme 's request, i wrote a small program in JS to count up the ends in and indent ti-basic source code, and say something if there are too many, or an extra one is needed. You can try/use it at https://jsfiddle.net/th4hnpmh/ (Changed to latest version)
All the code is here:
[spoiler]

<!DOCTYPE html>
<head>
    <script>
        function test() {
            var text = document.getElementById('text').value;
            var i = 0;
            var line = 0;
            for (var x = 0; x < text.length; x++) {
   var substring = text.substring(x).toLowerCase();
                if (text.charAt(x) == "\n") {
                    line++;
                    while(text.charAt(x+1) == ' '){
                     text = text.slice(0,x+1) + text.slice(x+2);
                    }
                substring = text.substring(x).toLowerCase();
                    if(substring.substring(1).startsWith("end")) {i--;}
var count=i;
if(substring.substring (1).startsWith("else")) {count--;}
                    for (var insert = 0; insert < count; insert++) {
                      text=text.slice(0,x+1)+" "+text.slice(x+1);
                    }
                   document.getElementById('text').value = text;
                }
                if (substring.startsWith("for")) {
                    i++;
                }
                if (substring.startsWith("then")) {
                    i++;
                }
                if (substring.startsWith("while")) {
                    i++;
                }
                if (substring.startsWith("repeat")) {
                    i++;
                }
                if (i == -1) {
                    alert("To many 'end's!\n" + "Line: " + line);
                    setCaretPosition("text", x);
                    insertAtCaret("text", "REMOVE thiS->")
                    break;
                }
                // alert(i);
            }
            if (i > 0) {
                alert("Missing an End!!!")
            }
        }

        function setCaretPosition(elemId, caretPos) {
            var elem = document.getElementById(elemId);

            if (elem != null) {
                if (elem.createTextRange) {
                    var range = elem.createTextRange();
                        range.move('character', caretPos);
                    range.select();
                } else {
                    if (elem.selectionStart) {
                        elem.focus();
                        elem.setSelectionRange(caretPos, caretPos);
                    } else elem.focus();
                }
            }
        }

        function insertAtCaret(areaId, text) {
            var txtarea = document.getElementById(areaId);
            var scrollPos = txtarea.scrollTop;
            var caretPos = txtarea.selectionStart;

            var front = (txtarea.value).substring(0, caretPos);
            var back = (txtarea.value).substring(txtarea.selectionEnd, txtarea.value.length);
            txtarea.value = front + text + back;
            caretPos = caretPos + text.length;
            txtarea.selectionStart = caretPos;
            txtarea.selectionEnd = caretPos;
            txtarea.focus();
            txtarea.scrollTop = scrollPos;
        }
    </script>
</head>
<body>
    <textarea rows="40" cols="50" id="text">type here</textarea>
   

    <button type="button" onClick="test()">Count!</button>
</body>

</html>

[/spoiler]

DJ Omnimaga

The best way to count missing ends is to indent your code, but sadly that is not possible when programming on-calc (it would actually make it harder to read the code, because the screen is so small, plus it would take too much RAM space). I think that such tool was suggested long ago, but I don't remember if it was ever implemented. The only closest thing I can remember was a variable usage detection program, which told you if a variable was in use in your BASIC program.


Also, sometimes loops will not stop prematurely due to missing End instructions, but rather due to a conditional error, such as the > and < signs being inverted as a typo, or variable conflicts.

Ivoah

Quote from: DJ Omnimaga on October 26, 2015, 06:07:06 am
The best way to count missing ends is to indent your code, but sadly that is not possible when programming on-calc (it would actually make it harder to read the code, because the screen is so small, plus it would take too much RAM space). I think that such tool was suggested long ago, but I don't remember if it was ever implemented. The only closest thing I can remember was a variable usage detection program, which told you if a variable was in use in your BASIC program.


Also, sometimes loops will not stop prematurely due to missing End instructions, but rather due to a conditional error, such as the > and < signs being inverted as a typo, or variable conflicts.

Necro bump  >:D
You can indent you code with ':', but as you mentioned it wastes space and slows it down.

DJ Omnimaga

Nah using : instead of a linebreak actually takes the same amount of space. I don't know if it slows execution down, but it considerably speeds up the time it takes to scroll through the code on color models.

c4ooo

Quote from: DJ Omnimaga on February 24, 2016, 02:50:12 am
Nah using : instead of a linebreak actually takes the same amount of space. I don't know if it slows execution down, but it considerably speeds up the time it takes to scroll through the code on color models.

The ":" does not work with return statement though, ive had this problem in the Lazer I.
Ex:

If A=1
Then
Blah
Blah
Return
End
If A=2
Then
Blah
Blah
Return
End
If A=3
Then
Blah
Blah
Return
End

works fine but

If A=1:Then:Blah:Blah:Return:End:If A=2:Then:Blah:Blah:Return:End:If A=3:Then:Blah:Blah:Return:End

wont work correctly >_>

DJ Omnimaga

Really? I never noticed that before. I thought that : only failed with the Lbl command... ???

Is that a newly introduced OS bug? Can anyone else reproduce? You should make a screenshot

c4ooo

Quote from: DJ Omnimaga on March 03, 2016, 08:13:15 pm
Really? I never noticed that before. I thought that : only failed with the Lbl command... ???

Is that a newly introduced OS bug? Can anyone else reproduce? You should make a screenshot

I know its present in 2.55MP, dont know about earlier OSs.
Also there was a cemetech post about this exact bug.

DJ Omnimaga

I'll try to remember to try reproducing the bug on various OS'es when I have soms time.

OS 1.12 had that weird glitch where :Then with an extra : caused a syntax error, but it was fixed afterwards.

The Omni topic might mention it. It has plenty of ancient bugs.

c4ooo

Update time: your code will now be auto indented!
https://jsfiddle.net/L33gnLk9/

Code:
[spoiler]
<!DOCTYPE html>
<head>
    <script>
        function test() {
            var text = document.getElementById('text').value;
            var i = 0;
            var line = 0;
            for (var x = 0; x < text.length; x++) {
                if (text.charAt(x) == "\n") {
                    line++;
                    while(text.charAt(x+1) == ' '){
                     text = text.slice(0,x+1) + text.slice(x+2);
                    }
                var substring = text.substring(x).toLowerCase();
                    if(substring.substring(1).startsWith("end")) {i--;}
                    for (var insert = 0; insert < i; insert++) {
                      text=text.slice(0,x+1)+" "+text.slice(x+1);
                    }
                   document.getElementById('text').value = text;
                }
                if (substring.startsWith("for")) {
                    i++;
                }
                if (substring.startsWith("then")) {
                    i++;
                }
                if (substring.startsWith("while")) {
                    i++;
                }
                if (substring.startsWith("repeat")) {
                    i++;
                }
                if (substring.startsWith("end")) {
                   // i--;
                }
                if (i == -1) {
                    alert("To many 'end's!\n" + "Line: " + line);
                    setCaretPosition("text", x);
                    insertAtCaret("text", "REMOVE thiS->")
                    break;
                }
                // alert(i);
            }
            if (i > 0) {
                alert("Missing an End!!!")
            }
        }

        function setCaretPosition(elemId, caretPos) {
            var elem = document.getElementById(elemId);

            if (elem != null) {
                if (elem.createTextRange) {
                    var range = elem.createTextRange();
                        range.move('character', caretPos);
                    range.select();
                } else {
                    if (elem.selectionStart) {
                        elem.focus();
                        elem.setSelectionRange(caretPos, caretPos);
                    } else elem.focus();
                }
            }
        }

        function insertAtCaret(areaId, text) {
            var txtarea = document.getElementById(areaId);
            var scrollPos = txtarea.scrollTop;
            var caretPos = txtarea.selectionStart;

            var front = (txtarea.value).substring(0, caretPos);
            var back = (txtarea.value).substring(txtarea.selectionEnd, txtarea.value.length);
            txtarea.value = front + text + back;
            caretPos = caretPos + text.length;
            txtarea.selectionStart = caretPos;
            txtarea.selectionEnd = caretPos;
            txtarea.focus();
            txtarea.scrollTop = scrollPos;
        }
    </script>
</head>
<body>
    <textarea rows="40" cols="50" id="text">type here</textarea>
   

    <button type="button" onClick="test()">Count!</button>
</body>

</html>
[/spoiler]

DJ Omnimaga

I typed While 1: Goto 0:End with line breaks and then clicked Count and nothing happened. I am using Opera 42

c4ooo


DJ Omnimaga

By the way @c4ooo I tried the second link and it still does nothing.

c4ooo

Quote from: DJ Omnimaga on March 11, 2017, 12:39:30 am
By the way @c4ooo I tried the second link and it still does nothing.

Are you sure? Its working for me  :(
This is the latest link: https://jsfiddle.net/th4hnpmh/

DJ Omnimaga

Yeah it does nothing for me. I think cross-browser compatibility is the problem. In which browser have you tested this?

p2

it loads tons of external scripts like from google. some of us might want to recheck the filter settings as well ;)
Anyway war sucks. Just bring us your food instead of missiles  :P ~ DJ Omnimaga (11.10.2016 20:21:48)
if you cant get a jframe set up, draw stuff to it, and receive input, i can only imagine how horrible your game code is _._   ~ c4ooo (14.11.2016 22:44:07)
If they pull a Harambe on me tell my family I love them ~ u/Pwntear37d (AssangeWatch /r/)
make Walrii great again ~ DJ Omnimaga (28.11.2016 23:01:31)
God invented the pc, satan the smartphone I guess ~ p4nix (16.02.2017 22:51:49)

Powered by EzPortal