From 64433bd8ddfac748971d0e850184f4274b1b2bda Mon Sep 17 00:00:00 2001 From: Skgland Date: Sat, 6 Feb 2021 19:39:02 +0100 Subject: [PATCH] fix macro hygien --- crates/prolog_parser/src/ast.rs | 50 +++++--- crates/prolog_parser/src/lexer.rs | 4 +- crates/prolog_parser/src/macros.rs | 173 +++++++++++++++++--------- crates/prolog_parser/src/tabled_rc.rs | 39 +++--- src/heap_print.rs | 8 +- src/machine/system_calls.rs | 9 +- 6 files changed, 176 insertions(+), 107 deletions(-) diff --git a/crates/prolog_parser/src/ast.rs b/crates/prolog_parser/src/ast.rs index ba480415..5810b94c 100644 --- a/crates/prolog_parser/src/ast.rs +++ b/crates/prolog_parser/src/ast.rs @@ -40,20 +40,23 @@ pub const NEGATIVE_SIGN: u32 = 0x0200; #[macro_export] macro_rules! clause_name { ($name: expr, $tbl: expr) => { - ClauseName::User(TabledRc::new($name, $tbl.clone())) + $crate::ast::ClauseName::User($crate::tabled_rc::TabledRc::new($name, $tbl.clone())) }; ($name: expr) => { - ClauseName::BuiltIn($name) + $crate::ast::ClauseName::BuiltIn($name) }; } #[macro_export] macro_rules! atom { ($e:expr, $tbl:expr) => { - Constant::Atom(ClauseName::User(tabled_rc!($e, $tbl)), None) + $crate::ast::Constant::Atom( + $crate::ast::ClauseName::User($crate::tabled_rc!($e, $tbl)), + None, + ) }; ($e:expr) => { - Constant::Atom(clause_name!($e), None) + $crate::ast::Constant::Atom($crate::clause_name!($e), None) }; } @@ -65,95 +68,102 @@ macro_rules! rc_atom { } macro_rules! is_term { ($x:expr) => { - ($x & TERM) != 0 + ($x & $crate::ast::TERM) != 0 }; } macro_rules! is_lterm { ($x:expr) => { - ($x & LTERM) != 0 + ($x & $crate::ast::LTERM) != 0 }; } macro_rules! is_op { ($x:expr) => { - $x & (XF | YF | FX | FY | XFX | XFY | YFX) != 0 + $x & ($crate::ast::XF + | $crate::ast::YF + | $crate::ast::FX + | $crate::ast::FY + | $crate::ast::XFX + | $crate::ast::XFY + | $crate::ast::YFX) + != 0 }; } macro_rules! is_negate { ($x:expr) => { - ($x & NEGATIVE_SIGN) != 0 + ($x & $crate::ast::NEGATIVE_SIGN) != 0 }; } #[macro_export] macro_rules! is_prefix { ($x:expr) => { - $x & (FX | FY) != 0 + $x & ($crate::ast::FX | $crate::ast::FY) != 0 }; } #[macro_export] macro_rules! is_postfix { ($x:expr) => { - $x & (XF | YF) != 0 + $x & ($crate::ast::XF | $crate::ast::YF) != 0 }; } #[macro_export] macro_rules! is_infix { ($x:expr) => { - ($x & (XFX | XFY | YFX)) != 0 + ($x & ($crate::ast::XFX | $crate::ast::XFY | $crate::ast::YFX)) != 0 }; } #[macro_export] macro_rules! is_xfx { ($x:expr) => { - ($x & XFX) != 0 + ($x & $crate::ast::XFX) != 0 }; } #[macro_export] macro_rules! is_xfy { ($x:expr) => { - ($x & XFY) != 0 + ($x & $crate::ast::XFY) != 0 }; } #[macro_export] macro_rules! is_yfx { ($x:expr) => { - ($x & YFX) != 0 + ($x & $crate::ast::YFX) != 0 }; } #[macro_export] macro_rules! is_yf { ($x:expr) => { - ($x & YF) != 0 + ($x & $crate::ast::YF) != 0 }; } #[macro_export] macro_rules! is_xf { ($x:expr) => { - ($x & XF) != 0 + ($x & $crate::ast::XF) != 0 }; } #[macro_export] macro_rules! is_fx { ($x:expr) => { - ($x & FX) != 0 + ($x & $crate::ast::FX) != 0 }; } #[macro_export] macro_rules! is_fy { ($x:expr) => { - ($x & FY) != 0 + ($x & $crate::ast::FY) != 0 }; } @@ -227,14 +237,14 @@ impl Default for VarReg { #[macro_export] macro_rules! temp_v { ($x:expr) => { - RegType::Temp($x) + $crate::ast::RegType::Temp($x) }; } #[macro_export] macro_rules! perm_v { ($x:expr) => { - RegType::Perm($x) + $crate::ast::RegType::Perm($x) }; } diff --git a/crates/prolog_parser/src/lexer.rs b/crates/prolog_parser/src/lexer.rs index 16c60d19..aff75d23 100644 --- a/crates/prolog_parser/src/lexer.rs +++ b/crates/prolog_parser/src/lexer.rs @@ -14,7 +14,7 @@ macro_rules! is_not_eof { ($c:expr) => { match $c { Ok(c) => c, - Err(ParserError::UnexpectedEOF) => return Ok(true), + Err($crate::ast::ParserError::UnexpectedEOF) => return Ok(true), Err(e) => return Err(e), } }; @@ -26,7 +26,7 @@ macro_rules! consume_chars_with { match $e { Ok(Some(c)) => $token.push(c), Ok(None) => continue, - Err(ParserError::UnexpectedChar(..)) => break, + Err($crate::ast::ParserError::UnexpectedChar(..)) => break, Err(e) => return Err(e), } } diff --git a/crates/prolog_parser/src/macros.rs b/crates/prolog_parser/src/macros.rs index e4520aba..a28d7e22 100644 --- a/crates/prolog_parser/src/macros.rs +++ b/crates/prolog_parser/src/macros.rs @@ -1,187 +1,246 @@ #[macro_export] macro_rules! char_class { ($c: expr, [$head:expr]) => ($c == $head); - ($c: expr, [$head:expr $(, $cs:expr)+]) => ($c == $head || char_class!($c, [$($cs),*])); + ($c: expr, [$head:expr $(, $cs:expr)+]) => ($c == $head || $crate::char_class!($c, [$($cs),*])); } #[macro_export] macro_rules! symbolic_control_char { - ($c: expr) => (char_class!($c, ['a', 'b', 'f', 'n', 'r', 't', 'v', '0'])) + ($c: expr) => { + $crate::char_class!($c, ['a', 'b', 'f', 'n', 'r', 't', 'v', '0']) + }; } #[macro_export] macro_rules! space_char { - ($c: expr) => ($c == ' ') + ($c: expr) => { + $c == ' ' + }; } #[macro_export] macro_rules! layout_char { - ($c: expr) => (char_class!($c, [' ', '\n', '\t', '\u{0B}', '\u{0C}'])) + ($c: expr) => { + $crate::char_class!($c, [' ', '\n', '\t', '\u{0B}', '\u{0C}']) + }; } #[macro_export] macro_rules! symbolic_hexadecimal_char { - ($c: expr) => ($c == 'x') + ($c: expr) => { + $c == 'x' + }; } #[macro_export] macro_rules! octal_digit_char { - ($c: expr) => ($c >= '0' && $c <= '7') + ($c: expr) => { + $c >= '0' && $c <= '7' + }; } #[macro_export] macro_rules! binary_digit_char { - ($c: expr) => ($c >= '0' && $c <= '1') + ($c: expr) => { + $c >= '0' && $c <= '1' + }; } #[macro_export] macro_rules! hexadecimal_digit_char { - ($c: expr) => ($c >= '0' && $c <= '9' || - $c >= 'A' && $c <= 'F' || - $c >= 'a' && $c <= 'f') + ($c: expr) => { + $c >= '0' && $c <= '9' || $c >= 'A' && $c <= 'F' || $c >= 'a' && $c <= 'f' + }; } #[macro_export] macro_rules! exponent_char { - ($c: expr) => ($c == 'e' || $c == 'E') + ($c: expr) => { + $c == 'e' || $c == 'E' + }; } #[macro_export] macro_rules! sign_char { - ($c: expr) => ($c == '-' || $c == '+') + ($c: expr) => { + $c == '-' || $c == '+' + }; } #[macro_export] macro_rules! new_line_char { - ($c: expr) => ($c == '\n') + ($c: expr) => { + $c == '\n' + }; } #[macro_export] macro_rules! end_line_comment_char { - ($c: expr) => ($c == '%') + ($c: expr) => { + $c == '%' + }; } #[macro_export] macro_rules! comment_1_char { - ($c: expr) => ($c == '/') + ($c: expr) => { + $c == '/' + }; } #[macro_export] macro_rules! comment_2_char { - ($c: expr) => ($c == '*') + ($c: expr) => { + $c == '*' + }; } #[macro_export] macro_rules! capital_letter_char { - ($c: expr) => ($c >= 'A' && $c <= 'Z') + ($c: expr) => { + $c >= 'A' && $c <= 'Z' + }; } #[macro_export] macro_rules! small_letter_char { - ($c: expr) => ($c >= 'a' && $c <= 'z') + ($c: expr) => { + $c >= 'a' && $c <= 'z' + }; } #[macro_export] macro_rules! variable_indicator_char { - ($c: expr) => ($c == '_') + ($c: expr) => { + $c == '_' + }; } #[macro_export] macro_rules! graphic_char { - ($c: expr) => (char_class!($c, ['#', '$', '&', '*', '+', '-', '.', '/', ':', + ($c: expr) => ($crate::char_class!($c, ['#', '$', '&', '*', '+', '-', '.', '/', ':', '<', '=', '>', '?', '@', '^', '~'])) } #[macro_export] macro_rules! graphic_token_char { - ($c: expr) => (graphic_char!($c) || backslash_char!($c)) + ($c: expr) => { + $crate::graphic_char!($c) || $crate::backslash_char!($c) + }; } #[macro_export] macro_rules! alpha_char { - ($c: expr) => - (match $c { - 'a' ..= 'z' => true, - 'A' ..= 'Z' => true, + ($c: expr) => { + match $c { + 'a'..='z' => true, + 'A'..='Z' => true, '_' => true, - '\u{00A0}' ..= '\u{00BF}' => true, - '\u{00C0}' ..= '\u{00D6}' => true, - '\u{00D8}' ..= '\u{00F6}' => true, - '\u{00F8}' ..= '\u{00FF}' => true, - '\u{0100}' ..= '\u{017F}' => true, // Latin Extended-A - '\u{0180}' ..= '\u{024F}' => true, // Latin Extended-B - '\u{0250}' ..= '\u{02AF}' => true, // IPA Extensions - '\u{02B0}' ..= '\u{02FF}' => true, // Spacing Modifier Letters - '\u{0300}' ..= '\u{036F}' => true, // Combining Diacritical Marks - '\u{0370}' ..= '\u{03FF}' => true, // Greek/Coptic - '\u{0400}' ..= '\u{04FF}' => true, // Cyrillic - '\u{0500}' ..= '\u{052F}' => true, // Cyrillic Supplement - '\u{0530}' ..= '\u{058F}' => true, // Armenian - '\u{0590}' ..= '\u{05FF}' => true, // Hebrew - '\u{0600}' ..= '\u{06FF}' => true, // Arabic - '\u{0700}' ..= '\u{074F}' => true, // Syriac - _ => false - }) + '\u{00A0}'..='\u{00BF}' => true, + '\u{00C0}'..='\u{00D6}' => true, + '\u{00D8}'..='\u{00F6}' => true, + '\u{00F8}'..='\u{00FF}' => true, + '\u{0100}'..='\u{017F}' => true, // Latin Extended-A + '\u{0180}'..='\u{024F}' => true, // Latin Extended-B + '\u{0250}'..='\u{02AF}' => true, // IPA Extensions + '\u{02B0}'..='\u{02FF}' => true, // Spacing Modifier Letters + '\u{0300}'..='\u{036F}' => true, // Combining Diacritical Marks + '\u{0370}'..='\u{03FF}' => true, // Greek/Coptic + '\u{0400}'..='\u{04FF}' => true, // Cyrillic + '\u{0500}'..='\u{052F}' => true, // Cyrillic Supplement + '\u{0530}'..='\u{058F}' => true, // Armenian + '\u{0590}'..='\u{05FF}' => true, // Hebrew + '\u{0600}'..='\u{06FF}' => true, // Arabic + '\u{0700}'..='\u{074F}' => true, // Syriac + _ => false, + } + }; } #[macro_export] macro_rules! decimal_digit_char { - ($c: expr) => ($c >= '0' && $c <= '9') + ($c: expr) => { + $c >= '0' && $c <= '9' + }; } #[macro_export] macro_rules! decimal_point_char { - ($c: expr) => ($c == '.') + ($c: expr) => { + $c == '.' + }; } #[macro_export] macro_rules! alpha_numeric_char { - ($c: expr) => (alpha_char!($c) || decimal_digit_char!($c)) + ($c: expr) => { + $crate::alpha_char!($c) || $crate::decimal_digit_char!($c) + }; } #[macro_export] macro_rules! cut_char { - ($c: expr) => ($c == '!') + ($c: expr) => { + $c == '!' + }; } #[macro_export] macro_rules! semicolon_char { - ($c: expr) => ($c == ';') + ($c: expr) => { + $c == ';' + }; } #[macro_export] macro_rules! backslash_char { - ($c: expr) => ($c == '\\') + ($c: expr) => { + $c == '\\' + }; } #[macro_export] macro_rules! single_quote_char { - ($c: expr) => ($c == '\'') + ($c: expr) => { + $c == '\'' + }; } #[macro_export] macro_rules! double_quote_char { - ($c: expr) => ($c == '"') + ($c: expr) => { + $c == '"' + }; } #[macro_export] macro_rules! back_quote_char { - ($c: expr) => ($c == '`') + ($c: expr) => { + $c == '`' + }; } #[macro_export] macro_rules! meta_char { - ($c: expr) => ( char_class!($c, ['\\', '\'', '"', '`']) ) + ($c: expr) => { + $crate::char_class!($c, ['\\', '\'', '"', '`']) + }; } #[macro_export] macro_rules! solo_char { - ($c: expr) => ( char_class!($c, ['!', '(', ')', ',', ';', '[', ']', - '{', '}', '|', '%']) ) + ($c: expr) => { + $crate::char_class!($c, ['!', '(', ')', ',', ';', '[', ']', '{', '}', '|', '%']) + }; } #[macro_export] macro_rules! prolog_char { - ($c: expr) => (graphic_char!($c) || alpha_numeric_char!($c) || solo_char!($c) || - layout_char!($c) || meta_char!($c)) + ($c: expr) => { + $crate::graphic_char!($c) + || $crate::alpha_numeric_char!($c) + || $crate::solo_char!($c) + || $crate::layout_char!($c) + || $crate::meta_char!($c) + }; } diff --git a/crates/prolog_parser/src/tabled_rc.rs b/crates/prolog_parser/src/tabled_rc.rs index 271ad3bf..8fcf4b86 100644 --- a/crates/prolog_parser/src/tabled_rc.rs +++ b/crates/prolog_parser/src/tabled_rc.rs @@ -4,11 +4,11 @@ use std::collections::HashSet; use std::fmt; use std::hash::{Hash, Hasher}; use std::ops::Deref; -use std::rc::{Rc}; +use std::rc::Rc; pub struct TabledData { table: Rc>>>, - pub(crate) module_name: Rc + pub(crate) module_name: Rc, } impl fmt::Debug for TabledData { @@ -22,14 +22,15 @@ impl fmt::Debug for TabledData { impl Clone for TabledData { fn clone(&self) -> Self { - TabledData { table: self.table.clone(), - module_name: self.module_name.clone() } + TabledData { + table: self.table.clone(), + module_name: self.module_name.clone(), + } } } impl PartialEq for TabledData { - fn eq(&self, other: &TabledData) -> bool - { + fn eq(&self, other: &TabledData) -> bool { Rc::ptr_eq(&self.table, &other.table) && self.module_name == other.module_name } } @@ -39,7 +40,7 @@ impl TabledData { pub fn new(module_name: Rc) -> Self { TabledData { table: Rc::new(RefCell::new(HashSet::new())), - module_name + module_name, } } @@ -51,7 +52,7 @@ impl TabledData { pub struct TabledRc { pub(crate) atom: Rc, - pub table: TabledData + pub table: TabledData, } impl fmt::Debug for TabledRc { @@ -67,27 +68,27 @@ impl fmt::Debug for TabledRc { // from complaining when deriving Clone for StringList. impl Clone for TabledRc { fn clone(&self) -> Self { - TabledRc { atom: self.atom.clone(), table: self.table.clone() } + TabledRc { + atom: self.atom.clone(), + table: self.table.clone(), + } } } impl PartialOrd for TabledRc { - fn partial_cmp(&self, other: &Self) -> Option - { + fn partial_cmp(&self, other: &Self) -> Option { Some(self.atom.cmp(&other.atom)) } } impl Ord for TabledRc { - fn cmp(&self, other: &Self) -> Ordering - { + fn cmp(&self, other: &Self) -> Ordering { self.atom.cmp(&other.atom) } } impl PartialEq for TabledRc { - fn eq(&self, other: &TabledRc) -> bool - { + fn eq(&self, other: &TabledRc) -> bool { self.atom == other.atom } } @@ -104,7 +105,7 @@ impl TabledRc { pub fn new(atom: T, table: TabledData) -> Self { let atom = match table.borrow_mut().take(&atom) { Some(atom) => atom.clone(), - None => Rc::new(atom) + None => Rc::new(atom), }; table.borrow_mut().insert(atom.clone()); @@ -147,7 +148,7 @@ impl fmt::Display for TabledRc { #[macro_export] macro_rules! tabled_rc { - ($e:expr, $tbl:expr) => ( - TabledRc::new(String::from($e), $tbl.clone()) - ) + ($e:expr, $tbl:expr) => { + $crate::tabled_rc::TabledRc::new(String::from($e), $tbl.clone()) + }; } diff --git a/src/heap_print.rs b/src/heap_print.rs index 2bd5e3bf..a4c1354a 100644 --- a/src/heap_print.rs +++ b/src/heap_print.rs @@ -1,9 +1,9 @@ use prolog_parser_rebis::ast::*; use prolog_parser_rebis::{ - alpha_char, alpha_numeric_char, backslash_char, capital_letter_char, char_class, clause_name, - cut_char, decimal_digit_char, graphic_char, graphic_token_char, is_fx, is_infix, is_postfix, - is_prefix, is_xf, is_xfx, is_xfy, is_yfx, semicolon_char, sign_char, single_quote_char, - small_letter_char, solo_char, variable_indicator_char, + alpha_numeric_char, capital_letter_char, clause_name, cut_char, decimal_digit_char, + graphic_token_char, is_fx, is_infix, is_postfix, is_prefix, is_xf, is_xfx, is_xfy, is_yfx, + semicolon_char, sign_char, single_quote_char, small_letter_char, solo_char, + variable_indicator_char, }; use crate::clause_types::*; diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index cfad12af..61c7fbfe 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -1,11 +1,10 @@ use prolog_parser_rebis::ast::*; use prolog_parser_rebis::parser::*; -use prolog_parser_rebis::tabled_rc::*; use prolog_parser_rebis::{ - alpha_char, alpha_numeric_char, backslash_char, binary_digit_char, char_class, clause_name, - decimal_digit_char, exponent_char, graphic_char, graphic_token_char, hexadecimal_digit_char, - layout_char, meta_char, new_line_char, octal_digit_char, prolog_char, sign_char, solo_char, - symbolic_control_char, symbolic_hexadecimal_char, temp_v, + alpha_char, binary_digit_char, clause_name, decimal_digit_char, exponent_char, graphic_char, + graphic_token_char, hexadecimal_digit_char, layout_char, meta_char, new_line_char, + octal_digit_char, prolog_char, sign_char, solo_char, symbolic_control_char, + symbolic_hexadecimal_char, temp_v, }; use lazy_static::lazy_static; -- 2.54.0