pub struct GFConcrete {
pub flags: HashMap<String, String>,
pub start_cats: HashMap<String, (i32, i32)>,
pub total_fids: i32,
pub pproductions: HashMap<i32, Vec<Production>>,
/* private fields */
}
Expand description
Concrete syntax for linearizing abstract trees.
Defines realizations (linearizations) of the abstract grammar, which can be natural language, images, etc.
A concrete grammar maps abstract functions to linearization rules, which produce output forms based on the arguments.
§Example
concrete LangEng of Lang = {
lincat Sentence = Str;
lin MakeSentence n v = n ++ v;
}
Fields§
§flags: HashMap<String, String>
Flags for concrete-specific settings.
start_cats: HashMap<String, (i32, i32)>
Start category ranges.
total_fids: i32
Total number of FIds.
pproductions: HashMap<i32, Vec<Production>>
Parameter productions.
Implementations§
Source§impl GFConcrete
impl GFConcrete
Sourcepub fn new(
flags: HashMap<String, String>,
functions: Vec<RuntimeCncFun>,
productions: HashMap<i32, Vec<Production>>,
start_cats: HashMap<String, (i32, i32)>,
total_fids: i32,
) -> Self
pub fn new( flags: HashMap<String, String>, functions: Vec<RuntimeCncFun>, productions: HashMap<i32, Vec<Production>>, start_cats: HashMap<String, (i32, i32)>, total_fids: i32, ) -> Self
Creates a new concrete grammar.
§Arguments
flags
- Concrete-specific flags.functions
- List of runtime concrete functions.productions
- Map of productions by FId.start_cats
- Start category ranges.total_fids
- Total number of FIds.
§Examples
use gf_core::{GFConcrete, RuntimeCncFun, LinType, Production};
use std::collections::HashMap;
let flags = HashMap::new();
let functions = vec![];
let productions = HashMap::new();
let start_cats = HashMap::new();
let total_fids = 0;
let concrete = GFConcrete::new(flags, functions, productions, start_cats, total_fids);
Sourcepub fn from_json(json: Concrete) -> Self
pub fn from_json(json: Concrete) -> Self
Converts from JSON concrete to GFConcrete.
This method deserializes a Concrete structure into a usable GFConcrete, resolving sequence indices to actual symbols.
§Arguments
json
- The Concrete structure from JSON.
Sourcepub fn linearize_syms(&self, tree: &Fun, tag: &str) -> Vec<LinearizedSym>
pub fn linearize_syms(&self, tree: &Fun, tag: &str) -> Vec<LinearizedSym>
Sourcepub fn syms2toks(&self, syms: &[Sym]) -> Vec<TaggedString>
pub fn syms2toks(&self, syms: &[Sym]) -> Vec<TaggedString>
Sourcepub fn linearize_all(&self, tree: &Fun) -> Vec<String>
pub fn linearize_all(&self, tree: &Fun) -> Vec<String>
Sourcepub fn linearize(&self, tree: &Fun) -> String
pub fn linearize(&self, tree: &Fun) -> String
Linearizes a tree to a single string (first variant).
§Arguments
tree
- The tree to linearize.
§Returns
The linearized string.
Examples found in repository?
examples/basic_usage.rs (line 66)
18fn main() -> Result<(), Box<dyn std::error::Error>> {
19 // Uncomment the line below to see debug output from GF-Core operations
20 set_debug(true);
21
22 // Load a PGF grammar from binary file and convert to JSON
23 println!("LOG: Reading binary PGF file from disk...");
24 let pgf_content = fs::read("grammars/Food/Food.pgf")?;
25
26 println!("LOG: Attemp at parsing PGF file Food.pgf starting...");
27 let pgf = pgf2json::parse_pgf(&Bytes::from(pgf_content))?;
28
29 println!("LOG: Attemp at transforming pgf data to json...");
30 let json_string = pgf2json::pgf_to_json(&pgf)?;
31
32 println!("LOG: Result of parsing (json_string): {json_string}");
33 println!("TODO: Verify that json_string is json formated!");
34
35 // Parse JSON string back into PGF struct for runtime usage
36 let json_value: serde_json::Value = serde_json::from_str(&json_string)?;
37 println!("TODO: Understand purpose of (json_value): {json_string}" );
38
39 let pgf_struct: PGF = serde_json::from_value(json_value)?;
40 println!("TODO: Understand content of (pgf_struct): {:?}", pgf_struct);
41
42 // Convert to runtime grammar
43 println!("TODO: Purpose of GFGrammar::from_json(pgf_struct)");
44 let grammar: GFGrammar = GFGrammar::from_json(pgf_struct);
45
46
47 // Test our fixed abstract syntax parsing
48 println!("LOG: Testing fixed abstract syntax parsing");
49
50 let test_cases = [
51 "Fish",
52 "This(Fish)",
53 "Is(This(Fish), Delicious)",
54 "MakeS (NP) (VP)",
55 ];
56
57 for test_case in test_cases {
58 println!("\nTesting abstract syntax: '{}'", test_case);
59 match grammar.abstract_grammar.parse_tree(test_case, None) {
60 Some(tree) => {
61 println!("✓ Parsed successfully: {}", tree.print());
62
63 // Try to linearize this tree
64 if let Some(eng_concrete) = grammar.concretes.get("FoodEng") {
65 println!("LOG: Attempting linearization with FoodEng concrete grammar");
66 let english_output = eng_concrete.linearize(&tree);
67 println!(" English: '{}'", english_output);
68 }
69 }
70 None => {
71 println!("✗ Failed to parse");
72 }
73 }
74 }
75
76 // Also test the natural language parsing for comparison
77 println!("\n=== Natural Language Parsing (for comparison) ===");
78 if let Some(eng_concrete) = grammar.concretes.get("FoodEng") {
79 let trees = eng_concrete.parse_string("this fish is delicious", &grammar.abstract_grammar.startcat);
80
81 if trees.is_empty() {
82 println!("No valid parse found for 'this fish is delicious'");
83 } else {
84 println!("Found {} parse tree(s):", trees.len());
85 for (i, tree) in trees.iter().enumerate() {
86 println!(" Tree {}: {}", i + 1, tree.print());
87
88 // Linearize back to English
89 let english_output = eng_concrete.linearize(tree);
90 println!(" English: {}", english_output);
91 }
92 }
93 }
94
95 // Note: FoodIta concrete grammar not available in this PGF file
96 println!("Available concrete grammars: {:?}", grammar.concretes.keys().collect::<Vec<_>>());
97
98 Ok(())
99}
Sourcepub fn tag_and_linearize(&self, tree: &Fun) -> Vec<TaggedString>
pub fn tag_and_linearize(&self, tree: &Fun) -> Vec<TaggedString>
Sourcepub fn parse_string(&self, input: &str, cat: &str) -> Vec<Fun>
pub fn parse_string(&self, input: &str, cat: &str) -> Vec<Fun>
Parses a string into trees using the given start category.
§Arguments
input
- The input string.cat
- The start category.
§Returns
Vector of parsed trees.
Examples found in repository?
examples/basic_usage.rs (line 79)
18fn main() -> Result<(), Box<dyn std::error::Error>> {
19 // Uncomment the line below to see debug output from GF-Core operations
20 set_debug(true);
21
22 // Load a PGF grammar from binary file and convert to JSON
23 println!("LOG: Reading binary PGF file from disk...");
24 let pgf_content = fs::read("grammars/Food/Food.pgf")?;
25
26 println!("LOG: Attemp at parsing PGF file Food.pgf starting...");
27 let pgf = pgf2json::parse_pgf(&Bytes::from(pgf_content))?;
28
29 println!("LOG: Attemp at transforming pgf data to json...");
30 let json_string = pgf2json::pgf_to_json(&pgf)?;
31
32 println!("LOG: Result of parsing (json_string): {json_string}");
33 println!("TODO: Verify that json_string is json formated!");
34
35 // Parse JSON string back into PGF struct for runtime usage
36 let json_value: serde_json::Value = serde_json::from_str(&json_string)?;
37 println!("TODO: Understand purpose of (json_value): {json_string}" );
38
39 let pgf_struct: PGF = serde_json::from_value(json_value)?;
40 println!("TODO: Understand content of (pgf_struct): {:?}", pgf_struct);
41
42 // Convert to runtime grammar
43 println!("TODO: Purpose of GFGrammar::from_json(pgf_struct)");
44 let grammar: GFGrammar = GFGrammar::from_json(pgf_struct);
45
46
47 // Test our fixed abstract syntax parsing
48 println!("LOG: Testing fixed abstract syntax parsing");
49
50 let test_cases = [
51 "Fish",
52 "This(Fish)",
53 "Is(This(Fish), Delicious)",
54 "MakeS (NP) (VP)",
55 ];
56
57 for test_case in test_cases {
58 println!("\nTesting abstract syntax: '{}'", test_case);
59 match grammar.abstract_grammar.parse_tree(test_case, None) {
60 Some(tree) => {
61 println!("✓ Parsed successfully: {}", tree.print());
62
63 // Try to linearize this tree
64 if let Some(eng_concrete) = grammar.concretes.get("FoodEng") {
65 println!("LOG: Attempting linearization with FoodEng concrete grammar");
66 let english_output = eng_concrete.linearize(&tree);
67 println!(" English: '{}'", english_output);
68 }
69 }
70 None => {
71 println!("✗ Failed to parse");
72 }
73 }
74 }
75
76 // Also test the natural language parsing for comparison
77 println!("\n=== Natural Language Parsing (for comparison) ===");
78 if let Some(eng_concrete) = grammar.concretes.get("FoodEng") {
79 let trees = eng_concrete.parse_string("this fish is delicious", &grammar.abstract_grammar.startcat);
80
81 if trees.is_empty() {
82 println!("No valid parse found for 'this fish is delicious'");
83 } else {
84 println!("Found {} parse tree(s):", trees.len());
85 for (i, tree) in trees.iter().enumerate() {
86 println!(" Tree {}: {}", i + 1, tree.print());
87
88 // Linearize back to English
89 let english_output = eng_concrete.linearize(tree);
90 println!(" English: {}", english_output);
91 }
92 }
93 }
94
95 // Note: FoodIta concrete grammar not available in this PGF file
96 println!("Available concrete grammars: {:?}", grammar.concretes.keys().collect::<Vec<_>>());
97
98 Ok(())
99}
Trait Implementations§
Source§impl Clone for GFConcrete
impl Clone for GFConcrete
Source§fn clone(&self) -> GFConcrete
fn clone(&self) -> GFConcrete
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source
. Read moreAuto Trait Implementations§
impl Freeze for GFConcrete
impl RefUnwindSafe for GFConcrete
impl Send for GFConcrete
impl Sync for GFConcrete
impl Unpin for GFConcrete
impl UnwindSafe for GFConcrete
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more