Add support for comments

This commit is contained in:
Patrick Lühne 2020-05-12 05:55:23 +02:00
parent ae46634d67
commit 0216f90929
Signed by: patrick
GPG Key ID: 05F3611E97A70ABF
3 changed files with 45 additions and 9 deletions

View File

@ -192,7 +192,7 @@ where
pub fn parse(&self, level: usize) -> Result<crate::Formula, crate::parse::Error>
{
let indentation = " ".repeat(level);
let input = self.input.trim_start();
let input = trim_start(self.input);
log::trace!("{}- parsing formula: {}", indentation, input);
@ -258,7 +258,7 @@ where
{
"not" =>
{
let input = input.trim_start();
let input = trim_start(input);
log::trace!("{} parsing “not” formula body: {}", indentation, input);
let argument = FormulaStr::new(input, self.declarations, self.variable_declaration_stack).parse(level + 1)?;
@ -297,7 +297,7 @@ where
if let Some(quantifier) = quantifier
{
let input = input.trim_start();
let input = trim_start(input);
log::trace!("{} parsing “{:?}” formula body: {}", indentation, quantifier, input);
return self.quantified_formula(input, quantifier, level + 1);
@ -347,7 +347,7 @@ where
{
log::trace!("{} parsing predicate {}", indentation, predicate_name);
let input = input.trim_start();
let input = trim_start(input);
// Parse arguments if there are any
let (arguments, input) = match parenthesized_expression(input)?

View File

@ -104,7 +104,7 @@ pub(crate) fn variable_declarations(input: &str)
loop
{
input = input.trim_start();
input = trim_start(input);
input = match symbol(input)
{
@ -113,7 +113,7 @@ pub(crate) fn variable_declarations(input: &str)
_ => return Ok(Some((variable_declarations, input))),
};
input = input.trim_start();
input = trim_start(input);
let (variable_declaration, remaining_input) = match variable_declaration(input)
{
@ -304,7 +304,7 @@ where
let indentation = " ".repeat(level);
log::trace!("{}- parsing term: {}", indentation, self.input);
let input = self.input.trim_start();
let input = trim_start(self.input);
match input.chars().next()
{
@ -442,7 +442,7 @@ where
let function_name = identifier;
log::trace!("{} parsing function {}", indentation, function_name);
let input = input.trim_start();
let input = trim_start(input);
// Parse arguments if there are any
let (arguments, input) = match parenthesized_expression(input)?

View File

@ -3,6 +3,42 @@ fn substring_offset(substring: &str, string: &str) -> usize
substring.as_ptr() as usize - string.as_ptr() as usize
}
pub fn trim_start(mut input: &str) -> &str
{
loop
{
let original_input = input;
input = input.trim_start();
let mut input_characters = input.chars();
if let Some('#') = input_characters.next()
{
input = input_characters.as_str();
match (input.find('\n'), input.find('\r'))
{
(Some(newline_index), Some(carriage_return_index)) =>
{
let split_index = std::cmp::min(newline_index, carriage_return_index);
input = input.split_at(split_index).1;
},
(Some(split_index), _)
| (_, Some(split_index)) => input = input.split_at(split_index).1,
_ => input = &input[..input.len()],
}
}
if input.is_empty() || input == original_input
{
break;
}
}
input
}
#[derive(Clone, Copy, Eq, PartialEq)]
pub(crate) enum Keyword
{
@ -366,7 +402,7 @@ impl<'i, F> Tokens<'i, F>
fn next_token(&mut self) -> Option<Result<(usize, usize, Token<'i>), crate::parse::Error>>
{
self.input = self.input.trim_start();
self.input = trim_start(self.input);
let index_left = substring_offset(self.input, self.original_input);
let first_character = match self.input.chars().next()