how to check syntax error in state flow chart

10 views (last 30 days)
Hello All,
I would like to check syntax errors in state flow state chart. As you see below, I have called state which is State_name, Inside this state I have different actions. If you see state_action2 = 0 missed by following semi colon(;) and state_action3 is not within state area.
How can I check state actions line by line and syntax errors by using m-script/commands?
Any help would be appreciated..

Accepted Answer

Anthony Poulin
Anthony Poulin on 28 May 2015
I give you a small code (not optimize and without check...). The code give the "txt" variable which is the text from a stateflow state and then I put each line in a cell of the cell array "Line".
nlChar = findstr(txt, 10);
Line{1,1} = txt(1:nlChar(1));
for i = 2:length(nlChar)
Line{i,1} = txt(nlChar(i-1)+1:nlChar(i));
end
Line{i+1,1} = txt(nlChar(i):end);
Then, when you have this cell aray, you just have to make your check on each cells.
  9 Comments
Anthony Poulin
Anthony Poulin on 29 May 2015
Hello,
First I use the function "findstr" and it is a mistake because this function will be removed so prefer "strfind" function.
Then what I suggest is to make a cell array (1 cell per text line) containing a boolean. For each line containing "=", if the last (=> last line) or penultimate character (=> other lines, because the last char must be char(10))is a ";", then you have 1 oterwise 0?
nlCharEqualArray = {};
nlChar = strfind(txt, 10);
Line{1,1} = txt(1:nlChar(1));
for i = 2:length(nlChar)
Line{i,1} = txt(nlChar(i-1)+1:nlChar(i));
end
Line{i+1,1} = txt(nlChar(i):end);
for k=2 : length(Line)
nlCharEqual = strfind(Line{k}, '=');
if (~isempty(nlCharEqual))
nlCharEqualArray{k,1} = ~isempty(strfind(Line{k}(end-1:end), ';'));
%I test on the 2 last characters, if you want to test on the 5 (for exemple), just do: Line{k}(end-5:end)
end
end
Is it clear?
gvreddy
gvreddy on 9 Jun 2015
Edited: gvreddy on 9 Jun 2015
Thank you very much...You helped me a lot...

Sign in to comment.

More Answers (2)

Anthony Poulin
Anthony Poulin on 27 May 2015
Hello,
I can give you some command line which help you to access to the content of the stateflow chart.
% to catch the root of the stateflow chart, that yoy have selected by clicking on it
SfPath = gcb;
% to catch the stateflow object
SfObj = get_param(SfPath,'Object');
% to catch the chart object
ChartObj = SfObj.find('-isa','Stateflow.Chart');
% to catch all the StatesObj of the chart
StatesObj= ChartObj.find('-isa','Stateflow.State');
% To get the string in the FIRST chart (=> StatesObj(1))
StringInChart = get(StatesObj(1),'LabelString');
I hope it can help you.
(When I needed to access to stateflow data I found a lot of information in: Help > Stateflow > User's Guide > Using the API)
  1 Comment
gvreddy
gvreddy on 27 May 2015
Hello Anthony,
Thanks for reply.. I have tried that and here is my code:
m=sfroot;
chartArray = m.find('-isa','Stateflow.Chart');
for i = 1:length(chartArray)
current_chart = chartArray(i);
stateArray = chartArray.find('-isa','Stateflow.State');
for j = 1 : length(stateArray)
current_state = stateArray(j);
state_actions = get(current_state(1),'LabelString');
end
end
Here problem is, state_actions returns all statements as single char. please have look on image.
but I want to read actions statements separately. so that I can check each action statement last char whether it ended with semi colon (;) or not and also I can find the length of each action statement.
so please let me know any idea on that?

Sign in to comment.


Anthony Poulin
Anthony Poulin on 27 May 2015
Yes, you catch a char containing all the text.
Then you have to treat this char, to separate the line you can find the character "char(10)" (= new line) or "char(13)" (= carriage return).
Is it ok for you, or do you want a short example?

Categories

Find more on Complex Logic in Help Center and File Exchange

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!