Home Backend Development Golang Nested sentences

Nested sentences

Jul 31, 2024 am 10:27 AM

Sentenças aninhadas

For those who are not following POJ (Pascal on the JVM) it is a compiler that transforms a subset from Pascal to JASM (Java Assembly) so that we can use the JVM as an execution environment.

In the last post we resolved some important bugs, especially in the generation of the assembly. In this post we will talk about how to correctly generate the assembly for nested sentences.

As we are compiling for the JVM, it is necessary to detail the functioning of various points of this incredible virtual machine. Therefore, at various times I detail the internal functioning of the JVM as well as some of its instructions (opcodes).

Contexts

One of the necessary features to correctly deal with nested sentences is the possibility of having multiple contexts in the parser. This is because if the parser assumes one context only, nested control sentences that generate labels and jumps (like if, for, while and repeat) would generate jump addressing incorrectly.

There are two ways to deal with contexts, which are:

  • Parser recursive
  • Stack contexts

Usually I would use the recursive parser approach. However, in order to implement a recursive parser with ANTLR, due to the way the grammar was structured in POJ, it would be necessary to inject code directly into the grammar, an approach that is not recommended. As a result, we opted for the approach of stacking contexts.

As there was already a stack implementation that monitored the types that the parser stacked/unstacked in the JVM, in order to not have to create another stack for a specific type, we decided to create one stack generic in this PR. In addition to being able to take advantage of this implementation later, I can still refactor the old code and remove the existing specific stack.

In this commit the parser was changed to correctly stack/unstack function contexts. Basically at the beginning of the parser of a function the context is stacked, and at its end the context is unstacked.

Nested sentences

Control sentences like if, for, while and repeat worked correctly. However, if there were nested sentences, POJ did not store context and ended up erroneously generating labels and jumps. Here and here it was discussed how the generation of the assembly works for these control sentences.

For the example below, which contains an if nested inside another, POJ erroneously generated the labels and necessary jumps:

program NestedIfs;
begin
  if (1 > 2) then
    if (2 > 3 ) then
      writeln('1 > 2 and 2 > 3')
    else
      writeln('1 > 2 and 2 <= 3')
  else
    writeln('1 <= 2');
end.
Copy after login

This bug was known and I chose to resolve it when the parser supported contexts.

In this commit, the LabelsContext structure was created containing the following labels:

  • Else: necessary for the case of if with else;
  • NextStatement: contains the label of the next statement;
  • IterationStart: indicates testing the repetition structure in the case of while, repeat and for.

To validate the correct generation of the assembly, tests were created to validate nested if's, nested repeat's, nested while's as well as for's nested. Tests were created here to validate the generation of the assembly in the case of recursive functions. Furthermore, it was necessary to update the expected assembly of all existing tests. Finally, in this PR, parser was updated to use the new context structure.

Here is the complete PR of these changes. Here we have the commit containing the changes for the correct functioning of the if sentence, here the commit referring to the repeat, here the commit referring to while and here the commit referring to for.

Next steps

In the next post we will talk about data entry. Now it's not long before we complete one of the objectives of this project: reading a number from standard input and calculating its factorial.

Complete project code

The repository with the project's complete code and documentation is here.

The above is the detailed content of Nested sentences. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
1 months ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What are the vulnerabilities of Debian OpenSSL What are the vulnerabilities of Debian OpenSSL Apr 02, 2025 am 07:30 AM

OpenSSL, as an open source library widely used in secure communications, provides encryption algorithms, keys and certificate management functions. However, there are some known security vulnerabilities in its historical version, some of which are extremely harmful. This article will focus on common vulnerabilities and response measures for OpenSSL in Debian systems. DebianOpenSSL known vulnerabilities: OpenSSL has experienced several serious vulnerabilities, such as: Heart Bleeding Vulnerability (CVE-2014-0160): This vulnerability affects OpenSSL 1.0.1 to 1.0.1f and 1.0.2 to 1.0.2 beta versions. An attacker can use this vulnerability to unauthorized read sensitive information on the server, including encryption keys, etc.

How do you use the pprof tool to analyze Go performance? How do you use the pprof tool to analyze Go performance? Mar 21, 2025 pm 06:37 PM

The article explains how to use the pprof tool for analyzing Go performance, including enabling profiling, collecting data, and identifying common bottlenecks like CPU and memory issues.Character count: 159

How do you write unit tests in Go? How do you write unit tests in Go? Mar 21, 2025 pm 06:34 PM

The article discusses writing unit tests in Go, covering best practices, mocking techniques, and tools for efficient test management.

What libraries are used for floating point number operations in Go? What libraries are used for floating point number operations in Go? Apr 02, 2025 pm 02:06 PM

The library used for floating-point number operation in Go language introduces how to ensure the accuracy is...

What is the problem with Queue thread in Go's crawler Colly? What is the problem with Queue thread in Go's crawler Colly? Apr 02, 2025 pm 02:09 PM

Queue threading problem in Go crawler Colly explores the problem of using the Colly crawler library in Go language, developers often encounter problems with threads and request queues. �...

Transforming from front-end to back-end development, is it more promising to learn Java or Golang? Transforming from front-end to back-end development, is it more promising to learn Java or Golang? Apr 02, 2025 am 09:12 AM

Backend learning path: The exploration journey from front-end to back-end As a back-end beginner who transforms from front-end development, you already have the foundation of nodejs,...

How to specify the database associated with the model in Beego ORM? How to specify the database associated with the model in Beego ORM? Apr 02, 2025 pm 03:54 PM

Under the BeegoORM framework, how to specify the database associated with the model? Many Beego projects require multiple databases to be operated simultaneously. When using Beego...

How do you specify dependencies in your go.mod file? How do you specify dependencies in your go.mod file? Mar 27, 2025 pm 07:14 PM

The article discusses managing Go module dependencies via go.mod, covering specification, updates, and conflict resolution. It emphasizes best practices like semantic versioning and regular updates.

See all articles