11//! ST (Structured Text) extraction and parsing utilities.
22//!
33//! This module provides utilities for extracting ST code from PLCopen XML
4- //! and parsing it using the `iecst ` crate.
4+ //! and parsing it using the `iec61131 ` crate.
55//!
66//! PLCopen TC6 stores ST code in `<ST><xhtml:p><![CDATA[...]]></xhtml:p></ST>` elements,
77//! while IEC 61131-10 uses `<ST><![CDATA[...]]></ST>` directly.
@@ -105,35 +105,37 @@ pub fn extract_all_st_from_xml(xml: &str) -> Vec<(String, String)> {
105105 results
106106}
107107
108- /// Parse ST code string using iecst parser.
108+ /// Parse ST code string using iec61131 parser.
109109///
110- /// Returns parsed statements or an error.
110+ /// Returns parsed compilation unit or an error.
111111///
112112/// # Example
113113///
114114/// ```
115115/// use plcopen::st::parse_st;
116116///
117- /// let code = "x := 1 + 2;";
117+ /// let code = "FUNCTION Test : INT\n x := 1 + 2;\n Test := x;\nEND_FUNCTION ";
118118/// let result = parse_st(code);
119119/// assert!(result.is_ok());
120120/// ```
121- pub fn parse_st ( code : & str ) -> Result < Vec < iecst:: Stmt > , iecst:: ParseError > {
122- iecst:: parse_statements ( code)
121+ pub fn parse_st ( code : & str ) -> Result < iec61131:: CompilationUnit , iec61131:: ParseError > {
122+ let mut parser = iec61131:: Parser :: new ( code) ;
123+ parser. parse ( )
123124}
124125
125126/// Parse ST code and run analysis diagnostics.
126127///
127- /// Returns parsed statements with any diagnostics (warnings/errors).
128+ /// Returns parsed compilation unit with any diagnostics (warnings/errors).
128129pub fn analyze_st ( code : & str ) -> StAnalysisResult {
129- match iecst:: parse_statements ( code) {
130- Ok ( statements) => StAnalysisResult {
131- statements : Some ( statements) ,
130+ let mut parser = iec61131:: Parser :: new ( code) ;
131+ match parser. parse ( ) {
132+ Ok ( cu) => StAnalysisResult {
133+ compilation_unit : Some ( cu) ,
132134 parse_error : None ,
133- diagnostics : Vec :: new ( ) , // TODO: Add analysis when iecst supports statement-level analysis
135+ diagnostics : Vec :: new ( ) , // TODO: Add analysis using iec61131:: analysis
134136 } ,
135137 Err ( e) => StAnalysisResult {
136- statements : None ,
138+ compilation_unit : None ,
137139 parse_error : Some ( e) ,
138140 diagnostics : Vec :: new ( ) ,
139141 } ,
@@ -143,24 +145,23 @@ pub fn analyze_st(code: &str) -> StAnalysisResult {
143145/// Result of ST analysis including parsed AST and diagnostics.
144146#[ derive( Debug ) ]
145147pub struct StAnalysisResult {
146- /// Parsed statements (if parsing succeeded)
147- pub statements : Option < Vec < iecst :: Stmt > > ,
148+ /// Parsed compilation unit (if parsing succeeded)
149+ pub compilation_unit : Option < iec61131 :: CompilationUnit > ,
148150 /// Parse error (if parsing failed)
149- pub parse_error : Option < iecst :: ParseError > ,
150- /// Analysis diagnostics (warnings, hints, etc.)
151- pub diagnostics : Vec < iecst :: Diagnostic > ,
151+ pub parse_error : Option < iec61131 :: ParseError > ,
152+ /// Analysis diagnostics (warnings, hints, etc.) - placeholder for future analysis
153+ pub diagnostics : Vec < String > ,
152154}
153155
154156impl StAnalysisResult {
155157 /// Check if parsing was successful.
156158 pub fn is_ok ( & self ) -> bool {
157- self . statements . is_some ( )
159+ self . compilation_unit . is_some ( )
158160 }
159161
160162 /// Check if there are any errors (parse or diagnostic).
161163 pub fn has_errors ( & self ) -> bool {
162- self . parse_error . is_some ( )
163- || self . diagnostics . iter ( ) . any ( |d| d. severity == iecst:: Severity :: Error )
164+ self . parse_error . is_some ( )
164165 }
165166}
166167
@@ -243,21 +244,21 @@ END_IF;]]></xhtml:p></ST></body>"#;
243244
244245 #[ test]
245246 fn test_parse_st_simple ( ) {
246- let code = "x := 1 + 2;" ;
247+ let code = "FUNCTION Test : INT \n x := 1 + 2;\n Test := x; \n END_FUNCTION " ;
247248 let result = parse_st ( code) ;
248249 assert ! ( result. is_ok( ) ) ;
249250 }
250251
251252 #[ test]
252253 fn test_parse_st_if ( ) {
253- let code = "IF x > 0 THEN y := 1; END_IF;" ;
254+ let code = "FUNCTION Test : INT \n IF x > 0 THEN y := 1; END_IF;\n Test := y; \n END_FUNCTION " ;
254255 let result = parse_st ( code) ;
255256 assert ! ( result. is_ok( ) ) ;
256257 }
257258
258259 #[ test]
259260 fn test_analyze_st ( ) {
260- let code = "x := 1;" ;
261+ let code = "FUNCTION Test : INT \n x := 1;\n Test := x; \n END_FUNCTION " ;
261262 let result = analyze_st ( code) ;
262263 assert ! ( result. is_ok( ) ) ;
263264 assert ! ( !result. has_errors( ) ) ;
0 commit comments