私はC#で正規表現コードを実装しています。アセンブリ言語の解析Regex
ただし、読みにくいです。 と私は構文取り込むことができませんでした....
// tests
Regex identifier = new Regex("^[^0-9\t\r\n\\~\\!\\@\\#\\" +
"\\$\\%\\^\\&\\*\\(\\)\\+\\|\\\\\\[\\]\\{\\}\\:\\;" +
"\\'\\\"\\<\\>\\/\\?\\.\\,\\`\\- ][^\t\r\n\\~\\!\\@\\#\\" +
"\\$\\%\\^\\&\\*\\(\\)\\+\\|\\\\\\[\\]\\{\\}\\:\\;" +
"\\'\\\"\\<\\>\\/\\?\\.\\,\\`\\- ]*"); // _1234asdvvf or asdfvasdf (0asdfasdf -> X)
Regex number16 = new Regex("^([0][x][0-9A-Fa-f]*|[0-9a-fA-F]*[h])"); // 0xABCD or ABCDh
Regex number10 = new Regex("^[1-9][0-9]*"); // 123456 (-> X)
Regex number8 = new Regex("^[0][0-9]*"); //
Regex string_ = new Regex("^[\"]([^\"\r\n]|[\\][\"])*[\"]"); // "asdfkawer\"asdf\"asdfasdf"
Regex char_ = new Regex("^[\']([^\'\r\n]|[\\][\'])*[\']"); // 'asdfasdf\'asdfasdf\'asdfadf'
Regex boolean = new Regex("^(true|false)"); // true or false
Regex floating = new Regex("^([0]|[1-9][0-9]*)\\.[0-9]*[eE]?[\\+\\-]?[0-9]*[f]?"); // 1234.1234e-45123 or 0.123411234e+1234, 123.1234123e10
Regex limiter = new Regex("^(public|private|protected|internal)");
Regex impls = new Regex("^(extern|static|virtual|abstract)");
Regex whitespace= new Regex("^[\t\r\n ]*");
Regex operaters = new Regex("^[\\~\\!\\@\\#\\" +
"\\%\\^\\&\\*\\(\\)\\+\\|\\\\\\[\\]\\{\\}\\:\\;" +
"\\'\\\"\\<\\>\\/\\?\\.\\,\\-]");
// implements
Regex assemblyRegex = new Regex("^([a-zA-Z][a-zA-Z0-9]*[\t ]*" + // Opcode + Whitespace
"((" + // without Comma + Identifier or Numbers or String
"[^0-9\t\r\n\\~\\!\\@\\#\\" +
"\\$\\%\\^\\&\\*\\(\\)\\+\\|\\\\\\[\\]\\{\\}\\:\\;" +
"\\'\\\"\\<\\>\\/\\?\\.\\,\\`\\- ][^\t\r\n\\~\\!\\@\\#\\" +
"\\$\\%\\^\\&\\*\\(\\)\\+\\|\\\\\\[\\]\\{\\}\\:\\;" +
"\\'\\\"\\<\\>\\/\\?\\.\\,\\`\\- ]*" + // Identifier
"|" + // OR
"([0][x][0-9A-Fa-f]*|[0-9a-fA-F]*[h])" + // Hexa number
"|" + // OR
"[1-9][0-9]*" + // Decimal
"|" + // OR
"[\"]([^\"\r\n]|[\\][\"])*[\"]" + // String
")" + // generic cases
"|" + // OR
"(qword|dword|word|byte)?[\\[]" + // qword [
// Comma + Identifier or Numbers
"(([^0-9\t\r\n\\~\\!\\@\\#\\" +
"\\$\\%\\^\\&\\*\\(\\)\\+\\|\\\\\\[\\]\\{\\}\\:\\;" +
"\\'\\\"\\<\\>\\/\\?\\.\\,\\`\\- ][^\t\r\n\\~\\!\\@\\#\\" +
"\\$\\%\\^\\&\\*\\(\\)\\+\\|\\\\\\[\\]\\{\\}\\:\\;" +
"\\'\\\"\\<\\>\\/\\?\\.\\,\\`\\- ]*" + // Identifier
"|" + // OR
"([0][x][0-9A-Fa-f]*|[0-9a-fA-F]*[h])" + // Hexa number
"|" + // OR
"[1-9][0-9]*)" + // Decimal
"[\\+\\-\\*\\/\\%]?)*" + // Operators
"[\\]]" + // ]
")[\t ]*" + // DEST
"([\\,][\t ]*((" + // Comma + Identifier or Numbers or String
"[^0-9\t\r\n\\~\\!\\@\\#\\" +
"\\$\\%\\^\\&\\*\\(\\)\\+\\|\\\\\\[\\]\\{\\}\\:\\;" +
"\\'\\\"\\<\\>\\/\\?\\.\\,\\`\\- ][^\t\r\n\\~\\!\\@\\#\\" +
"\\$\\%\\^\\&\\*\\(\\)\\+\\|\\\\\\[\\]\\{\\}\\:\\;" +
"\\'\\\"\\<\\>\\/\\?\\.\\,\\`\\- ]*" + // Identifier
"|" + // OR
"([0][x][0-9A-Fa-f]*|[0-9a-fA-F]*[h])" + // Hexa number
"|" + // OR
"[1-9][0-9]*" + // Decimal
"|" + // OR
"[\"]([^\"\r\n]|[\\][\"])*[\"]" + // String
")" + // generic cases
"|" + // OR
"(qword|dword|word|byte)?[\\[]" + // qword [
// Comma + Identifier or Numbers
"(([^0-9\t\r\n\\~\\!\\@\\#\\" +
"\\$\\%\\^\\&\\*\\(\\)\\+\\|\\\\\\[\\]\\{\\}\\:\\;" +
"\\'\\\"\\<\\>\\/\\?\\.\\,\\`\\- ][^\t\r\n\\~\\!\\@\\#\\" +
"\\$\\%\\^\\&\\*\\(\\)\\+\\|\\\\\\[\\]\\{\\}\\:\\;" +
"\\'\\\"\\<\\>\\/\\?\\.\\,\\`\\- ]*" + // Identifier
"|" + // OR
"([0][x][0-9A-Fa-f]*|[0-9a-fA-F]*[h])" + // Hexa number
"|" + // OR
"[1-9][0-9]*)" + // Decimal
"[\\+\\-\\*\\/\\%]?)*" + // Operators
"[\\]]" + // ]
"))*" + // SRCS
"[\r\n]?" + // end of line.
"|" + // OR
"[\r\n\t ]" + // whitespace only.
"|" + // OR
"[\\;][^\r\n]*[\r\n])*"); // comment line.
Match match = assemblyRegex.Match("mov eax, 0xabcd\njmp abcdef\ncmp eax, ebx\ncmp a, b");
私は正規表現のコードをデバッグすることができますどのように、コード... から単語をキャプチャし、することができますどのように
....
(これは何かを開発するためではなく、ちょうど私の趣味@ _ @)
=>string[] { "mov", "eax", ",", "qword", "[", "esp", "+", "8", "]" }
のような結果を得たいです。 しかし、このコードは、構文を検証するためにのみ動作します。 (ただし、repz cmp a, b
は認識できません...) 別名、それは私の意図と別のコードでした。私はそれをどこで修正するか分からない。
- regexをより簡単にデバッグする方法はありますか?
- トークンを抽出する方法はありますか?
- 正規表現を書く方が簡単ですか?
https://regex101.comを試しましたか? –
正規表現アナライザ? Expressoを見てください。.NETで書かれています。つまり、.NET Regexの実装を使用しています。http://www.ultrapico.com/expresso.htm –
文法はうまく収まるでしょうか? –