计数C指令
我正在用flex构建一个词法分析器。我必须对包含四条以上指令的函数执行某些操作。如何计算C源文件中的指令数?我试图计算分号(;)的数量,但如何处理这样的情况:if(strcmp(str1,str2)==2&&strlen(str1)>4)计数C指令,c,flex-lexer,lex,C,Flex Lexer,Lex,我正在用flex构建一个词法分析器。我必须对包含四条以上指令的函数执行某些操作。如何计算C源文件中的指令数?我试图计算分号(;)的数量,但如何处理这样的情况:if(strcmp(str1,str2)==2&&strlen(str1)>4) 上面有多少说明?我认为有六条指令:if、strcmp、strlen、&&、==、>。有没有定义指令的模式 我不认为你能在词汇上做到这一点,你至少需要做一些句法分析,可能还需要语义分析 此外,您需要先定义“指令”是什么,然后才能开始考虑计算它们。毕竟,术语“指令
上面有多少说明?我认为有六条指令:if、strcmp、strlen、&&、==、>。有没有定义指令的模式 我不认为你能在词汇上做到这一点,你至少需要做一些句法分析,可能还需要语义分析
此外,您需要先定义“指令”是什么,然后才能开始考虑计算它们。毕竟,术语“指令”在C中没有任何意义,您首先需要给它一个指令。在我的脑海中: 您需要注意表示未解析值的括号之前的标记(它们不是任何基本运算符)。这些可能被认为是指令 同样,您也希望将比较运算符作为一种指令形式放在lexer中 角点大小写是指标记以“它可能被假定为字符串的开头,并以”结尾,而没有前面的\标记字符串的结尾。这些标记应组合成单个字符串标记
使用C语言中关于变量和函数如何命名的规则,帮助您将未解析的值分解为标记序列。(示例:标记8*4*(打破了C中的命名规则,因此您知道应该通过使用运算符作为分隔符将未解析的值拆分来解析该值)我无法抗拒这个问题,因为我目前正在考虑使用Haskell作为一种美化的
perl
来分析和批量编辑我的C项目,并且想知道使用它有多简单。当然,还有很多其他的方法(正如Jörg指出的,词法分析器在这里不会割断芥末!),使用更流行的语言,但无论如何,这里有:
module Main where
import System.Environment
import Language.C.Parser
import Language.C.Data.InputStream
import Language.C.Data.Position
import Language.C.Syntax.AST
import Language.C.Syntax.Utils
import Language.C.Analysis.DeclAnalysis
import Language.C.Data.Ident
main :: IO ()
main = do
[cFileName] <- getArgs
stream <- readInputStream cFileName
let startpos = initPos cFileName
case parseC stream startpos of
Left parseError -> error $ show parseError
Right translation -> mapM_ (putStrLn . show) $ mungeTrans translation
mungeTrans (CTranslUnit decls _) = mungeDecls decls
mungeDecls [] = []
mungeDecls ((CFDefExt funDef):decls) = mungeFunDef funDef : mungeDecls decls
mungeDecls (_:decls) = mungeDecls decls
mungeFunDef (CFunDef _ declarator _ cStatement _) = (nameOf declarator, numberOfStatements cStatement) where
nameOf (CDeclr (Just name) _ _ _ _) = identToString name
nameOf _ = "?"
numberOfStatements cstat = case getSubStmts cstat of
[] -> 1
block -> foldl1 (+) $ map numberOfStatements block
我希望Haskell这个无耻的插件能说服一些人尝试这种工作!!请使用
flex-lexer
而不是flex
标签来回答您的问题。
("main",12)
("fork_child",21)
("main_loop",306)
("init_rlwrap",61)
("check_optarg",2)
("current_option",4)
etc.