mirror of
https://github.com/AleoHQ/leo.git
synced 2024-11-28 11:16:49 +03:00
Adds [constants] section to input file:
``` [constants] x: bool = true; // will be constant in program y: u32 = 100; ```
This commit is contained in:
parent
47e4d23ab1
commit
1551a82e18
@ -56,18 +56,29 @@ impl MainInput {
|
|||||||
self.input.insert(key, value);
|
self.input.insert(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn insert_constant(&mut self, key: String, value: Option<InputValue>) {
|
||||||
|
self.constants.insert(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
/// Parses main input definitions and stores them in `self`.
|
/// Parses main input definitions and stores them in `self`.
|
||||||
pub fn parse(&mut self, definitions: Vec<Definition>) -> Result<(), InputParserError> {
|
pub fn parse(&mut self, definitions: Vec<Definition>) -> Result<(), InputParserError> {
|
||||||
for definition in definitions {
|
for definition in definitions {
|
||||||
let name = definition.parameter.variable.value;
|
let name = definition.parameter.variable.value;
|
||||||
let is_const = definition.const_.is_some();
|
|
||||||
let value = InputValue::from_expression(definition.parameter.type_, definition.expression)?;
|
let value = InputValue::from_expression(definition.parameter.type_, definition.expression)?;
|
||||||
|
|
||||||
if is_const {
|
self.insert(name, Some(value));
|
||||||
self.constants.insert(name, Some(value));
|
|
||||||
} else {
|
|
||||||
self.input.insert(name, Some(value));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Parses constants input definitions and stores them in `self`.
|
||||||
|
pub fn parse_constants(&mut self, definitions: Vec<Definition>) -> Result<(), InputParserError> {
|
||||||
|
for definition in definitions {
|
||||||
|
let name = definition.parameter.variable.value;
|
||||||
|
let value = InputValue::from_expression(definition.parameter.type_, definition.expression)?;
|
||||||
|
|
||||||
|
self.insert_constant(name, Some(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -58,6 +58,7 @@ impl ProgramInput {
|
|||||||
/// Parse each input included in a file and store them in `self`.
|
/// Parse each input included in a file and store them in `self`.
|
||||||
pub fn parse(&mut self, section: Section) -> Result<(), InputParserError> {
|
pub fn parse(&mut self, section: Section) -> Result<(), InputParserError> {
|
||||||
match section.header {
|
match section.header {
|
||||||
|
Header::Constants(_constants) => self.main.parse_constants(section.definitions),
|
||||||
Header::Main(_main) => self.main.parse(section.definitions),
|
Header::Main(_main) => self.main.parse(section.definitions),
|
||||||
Header::Registers(_registers) => self.registers.parse(section.definitions),
|
Header::Registers(_registers) => self.registers.parse(section.definitions),
|
||||||
header => Err(InputParserError::input_section_header(header)),
|
header => Err(InputParserError::input_section_header(header)),
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
|
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
use super::Const;
|
|
||||||
use crate::{ast::Rule, common::LineEnd, expressions::Expression, parameters::Parameter};
|
use crate::{ast::Rule, common::LineEnd, expressions::Expression, parameters::Parameter};
|
||||||
|
|
||||||
use pest::Span;
|
use pest::Span;
|
||||||
@ -23,17 +22,9 @@ use pest_ast::FromPest;
|
|||||||
#[derive(Clone, Debug, FromPest, PartialEq)]
|
#[derive(Clone, Debug, FromPest, PartialEq)]
|
||||||
#[pest_ast(rule(Rule::definition))]
|
#[pest_ast(rule(Rule::definition))]
|
||||||
pub struct Definition<'ast> {
|
pub struct Definition<'ast> {
|
||||||
pub const_: Option<Const<'ast>>,
|
|
||||||
pub parameter: Parameter<'ast>,
|
pub parameter: Parameter<'ast>,
|
||||||
pub expression: Expression<'ast>,
|
pub expression: Expression<'ast>,
|
||||||
pub line_end: LineEnd,
|
pub line_end: LineEnd,
|
||||||
#[pest_ast(outer())]
|
#[pest_ast(outer())]
|
||||||
pub span: Span<'ast>,
|
pub span: Span<'ast>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'ast> Definition<'ast> {
|
|
||||||
/// Check whether `const` keyword is placed before definition.
|
|
||||||
pub fn is_const(&self) -> bool {
|
|
||||||
self.const_.is_some()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -16,6 +16,3 @@
|
|||||||
|
|
||||||
pub mod definition;
|
pub mod definition;
|
||||||
pub use definition::*;
|
pub use definition::*;
|
||||||
|
|
||||||
pub mod const_;
|
|
||||||
pub use const_::*;
|
|
||||||
|
@ -210,19 +210,19 @@ registers = { "registers" }
|
|||||||
// Declared in sections/state.rs
|
// Declared in sections/state.rs
|
||||||
state = { "state" }
|
state = { "state" }
|
||||||
|
|
||||||
|
// Declared in sections/constants.rs
|
||||||
|
constants = { "constants" }
|
||||||
|
|
||||||
// Declared in sections/state_leaf.rs
|
// Declared in sections/state_leaf.rs
|
||||||
state_leaf = { "state_leaf" }
|
state_leaf = { "state_leaf" }
|
||||||
|
|
||||||
// Declared in sections/header.rs
|
// Declared in sections/header.rs
|
||||||
header = { main | record | registers | state_leaf | state | identifier }
|
header = { main | constants | record | registers | state_leaf | state | identifier }
|
||||||
|
|
||||||
/// Definitions
|
/// Definitions
|
||||||
|
|
||||||
// Declared in definition/const_modifier.rs
|
|
||||||
const_ = { "const" }
|
|
||||||
|
|
||||||
// Declared in definition/definition.rs
|
// Declared in definition/definition.rs
|
||||||
definition = { const_? ~ parameter ~ "=" ~ expression ~ LINE_END }
|
definition = { parameter ~ "=" ~ expression ~ LINE_END }
|
||||||
|
|
||||||
/// Table
|
/// Table
|
||||||
|
|
||||||
|
@ -20,8 +20,8 @@ use pest::Span;
|
|||||||
use pest_ast::FromPest;
|
use pest_ast::FromPest;
|
||||||
|
|
||||||
#[derive(Clone, Debug, FromPest, PartialEq)]
|
#[derive(Clone, Debug, FromPest, PartialEq)]
|
||||||
#[pest_ast(rule(Rule::const_))]
|
#[pest_ast(rule(Rule::constants))]
|
||||||
pub struct Const<'ast> {
|
pub struct Constants<'ast> {
|
||||||
#[pest_ast(outer())]
|
#[pest_ast(outer())]
|
||||||
pub span: Span<'ast>,
|
pub span: Span<'ast>,
|
||||||
}
|
}
|
@ -17,7 +17,7 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
ast::Rule,
|
ast::Rule,
|
||||||
common::Identifier,
|
common::Identifier,
|
||||||
sections::{Main, Record, Registers, State, StateLeaf},
|
sections::{Constants, Main, Record, Registers, State, StateLeaf},
|
||||||
};
|
};
|
||||||
|
|
||||||
use pest::Span;
|
use pest::Span;
|
||||||
@ -27,6 +27,7 @@ use std::fmt;
|
|||||||
#[derive(Clone, Debug, FromPest, PartialEq)]
|
#[derive(Clone, Debug, FromPest, PartialEq)]
|
||||||
#[pest_ast(rule(Rule::header))]
|
#[pest_ast(rule(Rule::header))]
|
||||||
pub enum Header<'ast> {
|
pub enum Header<'ast> {
|
||||||
|
Constants(Constants<'ast>),
|
||||||
Main(Main<'ast>),
|
Main(Main<'ast>),
|
||||||
Record(Record<'ast>),
|
Record(Record<'ast>),
|
||||||
Registers(Registers<'ast>),
|
Registers(Registers<'ast>),
|
||||||
@ -38,6 +39,7 @@ pub enum Header<'ast> {
|
|||||||
impl<'ast> Header<'ast> {
|
impl<'ast> Header<'ast> {
|
||||||
pub fn span(self) -> Span<'ast> {
|
pub fn span(self) -> Span<'ast> {
|
||||||
match self {
|
match self {
|
||||||
|
Header::Constants(constants) => constants.span,
|
||||||
Header::Main(main) => main.span,
|
Header::Main(main) => main.span,
|
||||||
Header::Record(record) => record.span,
|
Header::Record(record) => record.span,
|
||||||
Header::Registers(registers) => registers.span,
|
Header::Registers(registers) => registers.span,
|
||||||
@ -51,6 +53,7 @@ impl<'ast> Header<'ast> {
|
|||||||
impl<'ast> fmt::Display for Header<'ast> {
|
impl<'ast> fmt::Display for Header<'ast> {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
match self {
|
match self {
|
||||||
|
Header::Constants(_constants) => write!(f, "constants"),
|
||||||
Header::Main(_main) => write!(f, "main"),
|
Header::Main(_main) => write!(f, "main"),
|
||||||
Header::Record(_record) => write!(f, "record"),
|
Header::Record(_record) => write!(f, "record"),
|
||||||
Header::Registers(_registers) => write!(f, "registers"),
|
Header::Registers(_registers) => write!(f, "registers"),
|
||||||
|
@ -14,6 +14,9 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
|
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
pub mod constants;
|
||||||
|
pub use constants::*;
|
||||||
|
|
||||||
pub mod header;
|
pub mod header;
|
||||||
pub use header::*;
|
pub use header::*;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user