how to check syntax error in state flow chart

18 ビュー (過去 30 日間)
gvreddy
gvreddy 2015 年 5 月 26 日
編集済み: gvreddy 2015 年 6 月 9 日
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..

採用された回答

Anthony Poulin
Anthony Poulin 2015 年 5 月 28 日
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 件のコメント
Anthony Poulin
Anthony Poulin 2015 年 5 月 29 日
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 2015 年 6 月 9 日
編集済み: gvreddy 2015 年 6 月 9 日
Thank you very much...You helped me a lot...

サインインしてコメントする。

その他の回答 (2 件)

Anthony Poulin
Anthony Poulin 2015 年 5 月 27 日
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 件のコメント
gvreddy
gvreddy 2015 年 5 月 27 日
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?

サインインしてコメントする。


Anthony Poulin
Anthony Poulin 2015 年 5 月 27 日
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?

カテゴリ

Help Center および File ExchangeComplex Logic についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by