- enhancement: Keyword completion for asm/GAS files.

This commit is contained in:
Roy Qu 2023-02-12 18:13:24 +08:00
parent 2660096377
commit 02b64497d5
11 changed files with 694 additions and 467 deletions

View File

@ -9,7 +9,7 @@ Red Panda C++ Version 2.12
- enhancement: Generate debug info for nasm files in Linux/MacOS.
- enhancement: Compile/Run/Debug GAS source files.
- enhancement: Compile/Debug GAS source files in project.
- enhancement: Keyword completion for asm/GAS files.
Red Panda C++ Version 2.11

View File

@ -931,13 +931,16 @@ void Editor::keyPressEvent(QKeyEvent *event)
}
} else if (syntaxer()) {
//show keywords
processCommand(QSynedit::EditCommand::Char,ch,nullptr);
showCompletion("",false,CodeCompletionType::KeywordsOnly);
handled=true;
return;
}
}
} else {
if (pSettings->codeCompletion().enabled()
&& pSettings->codeCompletion().showCompletionWhileInput() ) {
if (mParser) {
if (syntaxer() && syntaxer()->language()==QSynedit::ProgrammingLanguage::CPP) {
//preprocessor ?
if ((mLastIdCharPressed==0) && (ch=='#') && lineText().isEmpty()) {
mLastIdCharPressed++;
@ -955,6 +958,21 @@ void Editor::keyPressEvent(QKeyEvent *event)
handled=true;
return;
}
} else if (syntaxer() && syntaxer()->language()==QSynedit::ProgrammingLanguage::ATTAssembly) {
if ((mLastIdCharPressed==0) && (ch=='.')) {
mLastIdCharPressed++;
processCommand(QSynedit::EditCommand::Char,ch,nullptr);
showCompletion("",false,CodeCompletionType::KeywordsOnly);
handled=true;
return;
}
if ((mLastIdCharPressed==0) && (ch=='%')) {
mLastIdCharPressed++;
processCommand(QSynedit::EditCommand::Char,ch,nullptr);
showCompletion("",false,CodeCompletionType::KeywordsOnly);
handled=true;
return;
}
}
}
mLastIdCharPressed = 0;
@ -3222,6 +3240,12 @@ void Editor::showCompletion(const QString& preWord,bool autoComplete, CodeComple
if (!word.startsWith('@')) {
return;
}
} else if (
(attr->tokenType() == QSynedit::TokenType::String) &&
(attr->tokenType() != QSynedit::TokenType::Character)) {
return;
} else if (type==CodeCompletionType::KeywordsOnly && syntaxer() && syntaxer()->language()==QSynedit::ProgrammingLanguage::ATTAssembly) {
word = getWordAtPosition(this,caretXY(),pBeginPos,pEndPos, WordPurpose::wpATTASMKeywords);
} else if (
(attr->tokenType() != QSynedit::TokenType::Operator) &&
(attr->tokenType() != QSynedit::TokenType::Space) &&
@ -3273,21 +3297,18 @@ void Editor::showCompletion(const QString& preWord,bool autoComplete, CodeComple
mCompletionPopup->show();
// Scan the current function body
QSet<QString> keywords;
if (syntaxer()) {
if (syntaxer()->language() != QSynedit::ProgrammingLanguage::CPP ) {
if (syntaxer()->language()==QSynedit::ProgrammingLanguage::Assembly) {
keywords = QSynedit::ASMSyntaxer::Directives;
foreach(const QString& keyword, QSynedit::ASMSyntaxer::Registers) {
keywords.insert(keyword);
}
foreach(const QString& keyword, QSynedit::ASMSyntaxer::Instructions) {
keywords.insert(keyword);
}
} else {
if (syntaxer()->language()==QSynedit::ProgrammingLanguage::ATTAssembly) {
if (word.startsWith("."))
keywords = QSynedit::ASMSyntaxer::ATTDirectives;
else if (word.startsWith("%"))
keywords = QSynedit::ASMSyntaxer::ATTRegisters;
else
keywords = QSynedit::ASMSyntaxer::Instructions;
} else
keywords = syntaxer()->keywords();
}
} else {
if (mUseCppSyntax) {
foreach (const QString& keyword, CppKeywords.keys()) {
@ -3508,6 +3529,11 @@ void Editor::completionInsert(bool appendFunc)
// delete the part of the word that's already been typed ...
QSynedit::BufferCoord p = wordEnd();
QSynedit::BufferCoord pStart = wordStart();
if (syntaxer() && syntaxer()->language()==QSynedit::ProgrammingLanguage::ATTAssembly) {
if (statement->command.startsWith(".")
|| statement->command.startsWith("#"))
pStart.ch--;
}
setCaretAndSelection(pStart,pStart,p);
// if we are inserting a function,
@ -3612,7 +3638,9 @@ bool Editor::onCompletionKeyPressed(QKeyEvent *event)
return false;
QString oldPhrase = mCompletionPopup->memberPhrase();
WordPurpose purpose = WordPurpose::wpCompletion;
if (oldPhrase.startsWith('#')) {
if (syntaxer() && syntaxer()->language()==QSynedit::ProgrammingLanguage::ATTAssembly) {
purpose = WordPurpose::wpATTASMKeywords;
} else if (oldPhrase.startsWith('#')) {
purpose = WordPurpose::wpDirective;
} else if (oldPhrase.startsWith('@')) {
purpose = WordPurpose::wpJavadoc;
@ -4429,6 +4457,23 @@ QString getWordAtPosition(QSynedit::QSynEdit *editor, const QSynedit::BufferCoor
}
}
// Copy backward until % .
if (purpose == Editor::WordPurpose::wpATTASMKeywords) {
while ((wordBegin >= 0) && (wordBegin < len)) {
if (editor->isIdentChar(s[wordBegin]))
wordBegin--;
else if (s[wordBegin] == '%') {
wordBegin--;
break;
} else if (s[wordBegin] == '.') {
wordBegin--;
break;
} else
break;
}
}
// Copy backward until #
if (purpose == Editor::WordPurpose::wpDirective) {
while ((wordBegin >= 0) && (wordBegin < len)) {

View File

@ -95,7 +95,8 @@ public:
wpHeaderCompletionStart, // walk backwards over path, including start '<' or '"'
wpDirective, // preprocessor
wpJavadoc, //javadoc
wpInformation // walk backwards over words, array, functions, parents, forwards over words
wpInformation, // walk backwards over words, array, functions, parents, forwards over words
wpATTASMKeywords,
};
enum class TipType {

View File

@ -40,6 +40,8 @@ QSynedit::PSyntaxer SyntaxerManager::getSyntaxer(QSynedit::ProgrammingLanguage l
return std::make_shared<QSynedit::CppSyntaxer>();
case QSynedit::ProgrammingLanguage::Assembly:
return std::make_shared<QSynedit::ASMSyntaxer>();
case QSynedit::ProgrammingLanguage::ATTAssembly:
return std::make_shared<QSynedit::ASMSyntaxer>(true);
case QSynedit::ProgrammingLanguage::Makefile:
return std::make_shared<QSynedit::MakefileSyntaxer>();
case QSynedit::ProgrammingLanguage::GLSL:
@ -62,8 +64,10 @@ QSynedit::PSyntaxer SyntaxerManager::getSyntaxer(const QString &filename)
return getSyntaxer(QSynedit::ProgrammingLanguage::CPP);
} else if (suffix == "vs" || suffix == "fs" || suffix == "frag") {
return getSyntaxer(QSynedit::ProgrammingLanguage::GLSL);
} else if (suffix == "s" || suffix == "asm") {
} else if (suffix == "asm") {
return getSyntaxer(QSynedit::ProgrammingLanguage::Assembly);
} else if (suffix == "s" || suffix == "S") {
return getSyntaxer(QSynedit::ProgrammingLanguage::ATTAssembly);
} else if (basename.compare("makefile", Qt::CaseInsensitive)==0) {
return getSyntaxer(QSynedit::ProgrammingLanguage::Makefile);
} else if (suffix.isEmpty()) {

View File

@ -35,6 +35,8 @@ SystemConsts::SystemConsts(): mDefaultFileFilters()
addDefaultFileFilter(QObject::tr("C files"),"*.c");
addDefaultFileFilter(QObject::tr("C++ files"),"*.cpp *.cc *.cxx");
addDefaultFileFilter(QObject::tr("Header files"),"*.h *.hh *.hpp");
addDefaultFileFilter(QObject::tr("GAS files"),"*.s *.S");
addDefaultFileFilter(QObject::tr("ASM files"),"*.asm");
addFileFilter(mIconFileFilters, QObject::tr("Icon files"), "*.ico");

View File

@ -6503,6 +6503,14 @@
<source>Do you really want to remove &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>GAS files</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ASM files</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RegisterModel</name>

File diff suppressed because it is too large Load Diff

View File

@ -6148,6 +6148,14 @@
<source>Do you really want to remove &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>GAS files</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ASM files</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RegisterModel</name>

View File

@ -25,73 +25,169 @@ const QSet<QString> ASMSyntaxer::Registers {
"bh","bl","bx","ebx",
"ch","cl","cx","ecx",
"dh","dl","dx","edx",
"rax","rbx","rcx","rdx","rsi","rdi","rbp",
"rsp","r8","r9","r10","r11","r12","r13","r14","r15",
"r8h","r8l","r8w","r8d",
"r9h","r9l","r9w","r9d",
"r10h","r10l","r10w","r10d",
"r11h","r11l","r11w","r11d",
"r12h","r12l","r12w","r12d",
"r13h","r13l","r13w","r13d",
"r14h","r14l","r14w","r14d",
"r15h","r15l","r15w","r15d"
"spl","sp","esp",
"bpl","bp","ebp",
"sil","si","esi",
"dil","di","edi",
"r8b","r8w","r8d",
"r9b","r9w","r9d",
"r10b","r10w","r10d",
"r11b","r11w","r11d",
"r12b","r12w","r12d",
"r13b","r13w","r13d",
"r14b","r14w","r14d",
"r15b","r15w","r15d",
"rax","rbx","rcx","rdx","rsp","rbp","rsi","rdi",
"r8","r9","r10","r11","r12","r13","r14","r15",
"ip","eip","rip",
"flags","eflags","rflags",
"cs","ds","ss","es","fs","gs",
"st0","st1","st2","st3","st4","st5","st6","st7",
"xmm0","xmm1","xmm2","xmm3",
"xmm4","xmm5","xmm6","xmm7",
"xmm8","xmm9","xmm10","xmm11",
"xmm12","xmm13","xmm14","xmm15",
};
const QSet<QString> ASMSyntaxer::ATTRegisters {
"%ah","%al","%ax","%eax",
"%bh","%bl","%bx","%ebx",
"%ch","%cl","%cx","%ecx",
"%dh","%dl","%dx","%edx",
"%spl","%sp","%esp",
"%bpl","%bp","%ebp",
"%sil","%si","%esi",
"%dil","%di","%edi",
"%r8b","%r8w","%r8d",
"%r9b","%r9w","%r9d",
"%r10b","%r10w","%r10d",
"%r11b","%r11w","%r11d",
"%r12b","%r12w","%r12d",
"%r13b","%r13w","%r13d",
"%r14b","%r14w","%r14d",
"%r15b","%r15w","%r15d",
"%rax","%rbx","%rcx","%rdx","%rsp","%rbp","%rsi","%rdi",
"%r8","%r9","%r10","%r11","%r12","%r13","%r14","%r15",
"%ip","%eip","%rip",
"%flags","%eflags","%rflags",
"%cs","%ds","%ss","%es","%fs","%gs",
"%st0","%st1","%st2","%st3","%st4","%st5","%st6","%st7",
"%xmm0","%xmm1","%xmm2","%xmm3",
"%xmm4","%xmm5","%xmm6","%xmm7",
"%xmm8","%xmm9","%xmm10","%xmm11",
"%xmm12","%xmm13","%xmm14","%xmm15",
};
const QSet<QString> ASMSyntaxer::Instructions {
"movb","movw","movl","movq",
"leab","leaw","leal","leaq",
"incb","incw","incl","incq",
"decb","decw","decl","decq",
"addb","addw","addl","addq",
"subb","subw","subl","subq",
"imulb","imulw","imull","imulq",
"divb","divw","divl","divq",
"xorb","xorw","xorl","xorq",
"orb","orw","orl","orq",
"andb","andw","andl","andq",
"salb","salw","sall","salq",
"shlb","shlw","shll","shlq",
"sarb","sarw","sarl","sarq",
"shrb","shrw","shrl","shrq",
"cmpb","cmpw","cmpl","cmpq",
"testb","testw","testl","testq",
"pushq","popq",
"cmove", "cmovz", "cmovne", "cmovnz",
"cmovs", "cmovns", "cmovg", "cmovge",
"cmovl", "cmovle", "cmova", "cmovae",
"cmovb", "cmovbe", "cmovnbe","cmovnb",
"cmovnae","cmovna",
"aaa","aad","aam","adc","add","and","arpl","bound","bsf","bsr","bswap","bt","btc","btr","bts",
"call","cbw","cdq","clc","cld","cli","clts","cmc","cmp","cmps","cmpsb","cmpsd","cmpsw",
"cmpxchg","cwd","cwde","daa","das","dec","div","emms","enter","f2xm1","fabs","fadd","faddp","fbld",
"fbstp","fchs","fclex","fcmovb","fcmovbe","fcmove","fcmovnb","fcmovnbe","fcmovne","fcmovnu",
"fcmovu","fcom","fcomi","fcomip","fcomp","fcompp","fcos","fdecstp","fdiv","fdivp","fdivr",
"fdivrp","femms","ffree","fiadd","ficom","ficomp","fidiv","fidivr","fild","fimul","fincstp",
"finit","fist","fistp","fisub","fisubr","fld","fld1","fldcw","fldenv","fldl2e","fldl2t","fldlg2",
"fldln2","fldpi","fldz","fmul","fmulp","fnclex","fninit","fnop","fnsave","fnstcw","fnstenv",
"fnstsw","fpatan","fprem1","fptan","frndint","frstor","fsave","fscale","fsin","fsincos",
"fsqrt","fst","fstcw","fstenv","fstp","fstsw","fsub","fsubp","fsubr","fsubrp","ftst",
"fucom","fucomi","fucomip","fucomp","fucompp","fwait","fxch","fxtract","fyl2xp1","hlt","idiv",
"imul","in","inc","ins","insb","insd","insw","int","into","invd","invlpg","iret","iretd","iretw",
"ja","jae","jb","jbe","jc","jcxz","je","jecxz","jg","jge","jl","jle","jmp","jna","jnae","jnb","jnbe","jnc",
"jne","jng","jnge","jnl","jnle","jno","jnp","jns","jnz","jo","jp","jpe","jpo","js","jz","lahf","lar","lds",
"lea","leave","les","lfs","lgdt","lgs","lidt","lldt","lmsw","lock","lods","lodsb","lodsd","lodsw",
"loop","loope","loopne","loopnz","loopz","lsl","lss","ltr","mov","movd","movq","movs","movsb",
"movsd","movsw","movsx","movzx","mul","neg","nop","not","or","out","outs","outsb","outsd","outsw",
"packssdw","packsswb","packuswb","paddb","paddd","paddsb","paddsw","paddusb","paddusw",
"paddw","pand","pandn","pavgusb","pcmpeqb","pcmpeqd","pcmpeqw","pcmpgtb","pcmpgtd","pcmpgtw",
"pf2id","pfacc","pfadd","pfcmpeq","pfcmpge","pfcmpgt","pfmax","pfmin","pfmul","pfrcp",
"pfrcpit1","pfrcpit2","pfrsqit1","pfrsqrt","pfsub","pfsubr","pi2fd","pmaddwd","pmulhrw",
"pmulhw","pmullw","pop","popa","popad","popaw","popf","popfd","popfw","por","prefetch","prefetchw",
"pslld","psllq","psllw","psrad","psraw","psrld","psrlq","psrlw","psubb","psubd","psubsb",
"psubsw","psubusb","psubusw","psubw","punpckhbw","punpckhdq","punpckhwd","punpcklbw",
"punpckldq","punpcklwd","push","pusha","pushad","pushaw","pushf","pushfd","pushfw","pxor",
"rcl","rcr","rep","repe","repne","repnz","repz","ret","rol","ror","sahf","sal","sar","sbb","scas",
"scasb","scasd","scasw","seta","setae","setb","setbe","setc","sete","setg","setge","setl","setle",
"setna","setnae","setnb","setnbe","setnc","setne","setng","setnge","setnl","setnle","setno",
"setnp","setns","setnz","seto","setp","setpo","sets","setz","sgdt","shl","shld","shr","shrd","sidt",
"sldt","smsw","stc","std","sti","stos","stosb","stosd","stosw","str","sub","test","verr","verw",
"wait","wbinvd","xadd","xchg","xlat","xlatb","xor",
"aaa","aad","aam","aas","adc","adcx","add","addpd","addps",
"addsd","addss","addsubpd","addsubps","adox","aesdec","aesdec128kl","aesdec256kl","aesdeclast","aesdecwide128kl",
"aesdecwide256kl","aesenc","aesenc128kl","aesenc256kl","aesenclast","aesencwide128kl","aesencwide256kl","aesimc","aeskeygenassist","and",
"andn","andnpd","andnps","andpd","andps","arpl","bextr","blendpd","blendps","blendvpd",
"blendvps","blsi","blsmsk","blsr","bndcl","bndcn","bndcu","bndldx","bndmk","bndmov",
"bndstx","bound","bsf","bsr","bswap","bt","btc","btr","bts","bzhi",
"call","cbw","cdq","cdqe","clac","clc","cld","cldemote","clflush","clflushopt",
"cli","clrssbsy","clts","clwb","cmc","cmova","cmovae","cmovb","cmovbe","cmovc",
"cmove","cmovg","cmovge","cmovl","cmovle","cmovna","cmovnae","cmovnb","cmovnbe","cmovnc",
"cmovne","cmovng","cmovnge","cmovnl","cmovnle","cmovno","cmovnp","cmovns","cmovnz","cmovo",
"cmovp","cmovpe","cmovpo","cmovs","cmovz","cmp","cmppd","cmpps","cmps","cmpsb",
"cmpsd","cmpsq","cmpss","cmpsw","cmpxchg","cmpxchg16b","cmpxchg8b","comisd","comiss","cpuid",
"cqo","crc32","cvtdq2pd","cvtdq2ps","cvtpd2dq","cvtpd2pi","cvtpd2ps","cvtpi2pd","cvtpi2ps","cvtps2dq",
"cvtps2pd","cvtps2pi","cvtsd2si","cvtsd2ss","cvtsi2sd","cvtsi2ss","cvtss2sd","cvtss2si","cvttpd2dq","cvttpd2pi",
"cvttps2dq","cvttps2pi","cvttsd2si","cvttss2si","cwd","cwde","daa","das","dec","div",
"divpd","divps","divsd","divss","dppd","dpps","emms","encodekey128","encodekey256","endbr32",
"endbr64","enter","extractps","f2xm1","fabs","fadd","faddp","fbld","fbstp","fchs",
"fclex","fcmovb","fcmove","fcmovbe","fcmovu","fcmovnb","fcmovne","fcmovnbe","fcmovnu","fcom",
"fcomi","fcomip","fcomp","fcompp","fcos","fdecstp","fdiv","fdivp","fdivr","fdivrp",
"ffree","fiadd","ficom","ficomp","fidiv","fidivr","fild","fimul","fincstp","finit",
"fist","fistp","fisttp","fisub","fisubr","fld","fld1","fldcw","fldenv","fldl2e",
"fldl2t","fldlg2","fldln2","fldpi","fldz","fmul","fmulp","fnclex","fninit","fnop",
"fnsave","fnstcw","fnstenv","fnstsw","fpatan","fprem","fprem1","fptan","frndint","frstor",
"fsave","fscale","fsin","fsincos","fsqrt","fst","fstcw","fstenv","fstp","fstsw",
"fsub","fsubp","fsubr","fsubrp","ftst","fucom","fucomi","fucomip","fucomp","fucompp",
"fwait","fxam","fxch","fxrstor","fxsave","fxtract","fyl2x","fyl2xp1","gf2p8affineinvqb","gf2p8affineqb",
"gf2p8mulb","haddpd","haddps","hlt","hreset","hsubpd","hsubps","idiv","imul","in",
"inc","incsspd","incsspq","ins","insb","insd","insertps","insw","int n","int1",
"int3","into","invd","invlpg","invpcid","iret","iretd","iretq","jmp","ja",
"jae","jb","jbe","jc","jcxz","je","jecxz","jg","jge","jl",
"jle","jna","jnae","jnb","jnbe","jnc","jne","jng","jnge","jnl",
"jnle","jno","jnp","jns","jnz","jo","jp","jpe","jpo","jrcxz",
"js","jz","kaddb","kaddd","kaddq","kaddw","kandb","kandd","kandnb","kandnd",
"kandnq","kandnw","kandq","kandw","kmovb","kmovd","kmovq","kmovw","knotb","knotd",
"knotq","knotw","korb","kord","korq","kortestb","kortestd","kortestq","kortestw","korw",
"kshiftlb","kshiftld","kshiftlq","kshiftlw","kshiftrb","kshiftrd","kshiftrq","kshiftrw","ktestb","ktestd",
"ktestq","ktestw","kunpckbw","kunpckdq","kunpckwd","kxnorb","kxnord","kxnorq","kxnorw","kxorb",
"kxord","kxorq","kxorw","lahf","lar","lddqu","ldmxcsr","lds","lea","leave",
"les","lfence","lfs","lgdt","lgs","lidt","lldt","lmsw","loadiwkey","lock",
"lods","lodsb","lodsd","lodsq","lodsw","loop","loope","loopne","lsl","lss",
"ltr","lzcnt","maskmovdqu","maskmovq","maxpd","maxps","maxsd","maxss","mfence","minpd",
"minps","minsd","minss","monitor","mov","movapd","movaps","movbe","movd","movddup",
"movdir64b","movdiri","movdq2q","movdqa","movdqu","movhlps","movhpd","movhps","movlhps","movlpd",
"movlps","movmskpd","movmskps","movntdq","movntdqa","movnti","movntpd","movntps","movntq","movq",
"movq2dq","movs","movsb","movsd","movshdup","movsldup","movsq","movss","movsw","movsx",
"movsxd","movupd","movups","movzx","mpsadbw","mul","mulpd","mulps","mulsd","mulss",
"mulx","mwait","neg","nop","not","or","orpd","orps","out","outs",
"outsb","outsd","outsw","pabsb","pabsd","pabsq","pabsw","packssdw","packsswb","packusdw",
"packuswb","paddb","paddd","paddq","paddsb","paddsw","paddusb","paddusw","paddw","palignr",
"pand","pandn","pause","pavgb","pavgw","pblendvb","pblendw","pclmulqdq","pcmpeqb","pcmpeqd",
"pcmpeqq","pcmpeqw","pcmpestri","pcmpestrm","pcmpgtb","pcmpgtd","pcmpgtq","pcmpgtw","pcmpistri","pcmpistrm",
"pconfig","pdep","pext","pextrb","pextrd","pextrq","pextrw","phaddd","phaddsw","phaddw",
"phminposuw","phsubd","phsubsw","phsubw","pinsrb","pinsrd","pinsrq","pinsrw","pmaddubsw","pmaddwd",
"pmaxsb","pmaxsd","pmaxsq","pmaxsw","pmaxub","pmaxud","pmaxuq","pmaxuw","pminsb","pminsd",
"pminsq","pminsw","pminub","pminud","pminuq","pminuw","pmovmskb","pmovsx","pmovzx","pmuldq",
"pmulhrsw","pmulhuw","pmulhw","pmulld","pmullq","pmullw","pmuludq","pop","popa","popad",
"popcnt","popf","popfd","popfq","por","prefetchw","prefetchh","psadbw","pshufb","pshufd",
"pshufhw","pshuflw","pshufw","psignb","psignd","psignw","pslld","pslldq","psllq","psllw",
"psrad","psraq","psraw","psrld","psrldq","psrlq","psrlw","psubb","psubd","psubq",
"psubsb","psubsw","psubusb","psubusw","psubw","ptest","ptwrite","punpckhbw","punpckhdq","punpckhqdq",
"punpckhwd","punpcklbw","punpckldq","punpcklqdq","punpcklwd","push","pusha","pushad","pushf","pushfd",
"pushfq","pxor","rcl","rcpps","rcpss","rcr","rdfsbase","rdgsbase","rdmsr","rdpid",
"rdpkru","rdpmc","rdrand","rdseed","rdsspd","rdsspq","rdtsc","rdtscp","rep","repe",
"repne","repnz","repz","ret","rol","ror","rorx","roundpd","roundps","roundsd",
"roundss","rsm","rsqrtps","rsqrtss","rstorssp","sahf","sal","sar","sarx","saveprevssp",
"sbb","scas","scasb","scasd","scasw","serialize","setssbsy","seta","setae","setb",
"setbe","setc","sete","setg","setge","setl","setle","setna","setnae","setnb",
"setnbe","setnc","setne","setng","setnge","setnl","setnle","setno","setnp","setns",
"setnz","seto","setp","setpe","setpo","sets","setz","sfence","sgdt","sha1msg1",
"sha1msg2","sha1nexte","sha1rnds4","sha256msg1","sha256msg2","sha256rnds2","shl","shld","shlx","shr",
"shrd","shrx","shufpd","shufps","sidt","sldt","smsw","sqrtpd","sqrtps","sqrtsd",
"sqrtss","stac","stc","std","sti","stmxcsr","stos","stosb","stosd","stosq",
"stosw","str","sub","subpd","subps","subsd","subss","swapgs","syscall","sysenter",
"sysexit","sysret","test","tpause","tzcnt","ucomisd","ucomiss","ud","umonitor","umwait",
"unpckhpd","unpckhps","unpcklpd","unpcklps","valignd","valignq","vblendmpd","vblendmps","vbroadcast","vcompresspd",
"vcompressps","vcompressw","vcvtne2ps2bf16","vcvtneps2bf16","vcvtpd2qq","vcvtpd2udq","vcvtpd2uqq","vcvtph2ps","vcvtps2ph","vcvtps2qq",
"vcvtps2udq","vcvtps2uqq","vcvtqq2pd","vcvtqq2ps","vcvtsd2usi","vcvtss2usi","vcvttpd2qq","vcvttpd2udq","vcvttpd2uqq","vcvttps2qq",
"vcvttps2udq","vcvttps2uqq","vcvttsd2usi","vcvttss2usi","vcvtudq2pd","vcvtudq2ps","vcvtuqq2pd","vcvtuqq2ps","vcvtusi2sd","vcvtusi2ss",
"vdbpsadbw","vdpbf16ps","verr","verw","vexpandpd","vexpandps","vextractf128","vextractf32x4","vextractf32x8","vextractf64x2",
"vextractf64x4","vextracti128","vextracti32x4","vextracti32x8","vextracti64x2","vextracti64x4","vfixupimmpd","vfixupimmps","vfixupimmsd","vfixupimmss",
"vfmadd132pd","vfmadd132ps","vfmadd132sd","vfmadd132ss","vfmadd213pd","vfmadd213ps","vfmadd213sd","vfmadd213ss","vfmadd231pd","vfmadd231ps",
"vfmadd231sd","vfmadd231ss","vfmaddsub132pd","vfmaddsub132ps","vfmaddsub213pd","vfmaddsub213ps","vfmaddsub231pd","vfmaddsub231ps","vfmsub132pd","vfmsub132ps",
"vfmsub132sd","vfmsub132ss","vfmsub213pd","vfmsub213ps","vfmsub213sd","vfmsub213ss","vfmsub231pd","vfmsub231ps","vfmsub231sd","vfmsub231ss",
"vfmsubadd132pd","vfmsubadd132ps","vfmsubadd213pd","vfmsubadd213ps","vfmsubadd231pd","vfmsubadd231ps","vfnmadd132pd","vfnmadd132ps","vfnmadd132sd","vfnmadd132ss",
"vfnmadd213pd","vfnmadd213ps","vfnmadd213sd","vfnmadd213ss","vfnmadd231pd","vfnmadd231ps","vfnmadd231sd","vfnmadd231ss","vfnmsub132pd","vfnmsub132ps",
"vfnmsub132sd","vfnmsub132ss","vfnmsub213pd","vfnmsub213ps","vfnmsub213sd","vfnmsub213ss","vfnmsub231pd","vfnmsub231ps","vfnmsub231sd","vfnmsub231ss",
"vfpclasspd","vfpclassps","vfpclasssd","vfpclassss","vgatherdpd","vgatherdps","vgatherqpd","vgatherqps","vgetexppd","vgetexpps",
"vgetexpsd","vgetexpss","vgetmantpd","vgetmantps","vgetmantsd","vgetmantss","vinsertf128","vinsertf32x4","vinsertf32x8","vinsertf64x2",
"vinsertf64x4","vinserti128","vinserti32x4","vinserti32x8","vinserti64x2","vinserti64x4","vmaskmov","vmovdqa32","vmovdqa64","vmovdqu16",
"vmovdqu32","vmovdqu64","vmovdqu8","vp2intersectd","vp2intersectq","vpblendd","vpblendmb","vpblendmd","vpblendmq","vpblendmw",
"vpbroadcast","vpbroadcastb","vpbroadcastd","vpbroadcastm","vpbroadcastq","vpbroadcastw","vpcmpb","vpcmpd","vpcmpq","vpcmpub",
"vpcmpud","vpcmpuq","vpcmpuw","vpcmpw","vpcompressb","vpcompressd","vpcompressq","vpconflictd","vpconflictq","vpdpbusd",
"vpdpbusds","vpdpwssd","vpdpwssds","vperm2f128","vperm2i128","vpermb","vpermd","vpermi2b","vpermi2d","vpermi2pd",
"vpermi2ps","vpermi2q","vpermi2w","vpermilpd","vpermilps","vpermpd","vpermps","vpermq","vpermt2b","vpermt2d",
"vpermt2pd","vpermt2ps","vpermt2q","vpermt2w","vpermw","vpexpandb","vpexpandd","vpexpandq","vpexpandw","vpgatherdd",
"vpgatherdq","vpgatherqd","vpgatherqq","vplzcntd","vplzcntq","vpmadd52huq","vpmadd52luq","vpmaskmov","vpmovb2m","vpmovd2m",
"vpmovdb","vpmovdw","vpmovm2b","vpmovm2d","vpmovm2q","vpmovm2w","vpmovq2m","vpmovqb","vpmovqd","vpmovqw",
"vpmovsdb","vpmovsdw","vpmovsqb","vpmovsqd","vpmovsqw","vpmovswb","vpmovusdb","vpmovusdw","vpmovusqb","vpmovusqd",
"vpmovusqw","vpmovuswb","vpmovw2m","vpmovwb","vpmultishiftqb","vpopcnt","vprold","vprolq","vprolvd","vprolvq",
"vprord","vprorq","vprorvd","vprorvq","vpscatterdd","vpscatterdq","vpscatterqd","vpscatterqq","vpshld","vpshldv",
"vpshrd","vpshrdv","vpshufbitqmb","vpsllvd","vpsllvq","vpsllvw","vpsravd","vpsravq","vpsravw","vpsrlvd",
"vpsrlvq","vpsrlvw","vpternlogd","vpternlogq","vptestmb","vptestmd","vptestmq","vptestmw","vptestnmb","vptestnmd",
"vptestnmq","vptestnmw","vrangepd","vrangeps","vrangesd","vrangess","vrcp14pd","vrcp14ps","vrcp14sd","vrcp14ss",
"vreducepd","vreduceps","vreducesd","vreducess","vrndscalepd","vrndscaleps","vrndscalesd","vrndscaless","vrsqrt14pd","vrsqrt14ps",
"vrsqrt14sd","vrsqrt14ss","vscalefpd","vscalefps","vscalefsd","vscalefss","vscatterdpd","vscatterdps","vscatterqpd","vscatterqps",
"vshuff32x4","vshuff64x2","vshufi32x4","vshufi64x2","vtestpd","vtestps","vzeroall","vzeroupper","wait","wbinvd",
"wbnoinvd","wrfsbase","wrgsbase","wrmsr","wrpkru","wrssd","wrssq","wrussd","wrussq","xabort",
"xacquire","xadd","xbegin","xchg","xend","xgetbv","xlat","xlatb","xor","xorpd",
"xorps","xrelease","xrstor","xrstors","xsave","xsavec","xsaveopt","xsaves","xsetbv","xtest",
};
const QSet<QString> ASMSyntaxer::Directives {
@ -101,9 +197,37 @@ const QSet<QString> ASMSyntaxer::Directives {
"equ","times","word","dword","byte","tword"
};
const QSet<QString> ASMSyntaxer::ATTDirectives {
".abort",".align",".altmacro",".ascii",
".asciz",".attach",".balign",".bss",
".bundle",".byte",".comm",".data",
".dc",".dcb",".ds",".def", ".desc",
".dim","double",".eject",".else",
".elseif",".end",".endef","endfunc",
".endif",".equ",".equiv",".eqy",
".err",".error",".exitm",".extern",
".fail",".file",".fill", ".float",
".func",".global",".gnu",".hidden",
".hword",".ident",".if", ".incbin",
".inclue", ".int", ".internal", ".irp",
".irpc",".lcomm",".lflags",".line",".linkonce",
".list", ".ln", ".loc",".local",".macro",
".mri",".noaltmacro",".nolist",".nop",".nops",
".octa",".offset",".org",".p2align",".popsection",
".previous",".print",".protected",".psize",
".purgem",".pushsection",".quad",".reloc",
".rept", ".sbttl", ".scl", ".section",
".set", ".short", ".single", ".size",
".skip", ".sleb128", ".space_size", ".stabd",
".stabn", ".stabs", ".string", ".string8", ".string16",
".struct", ".subsection", ".symver", ".tag", ".text",
".title", ".tls", ".type", ".uleb128", ".val",".version",
".vtable", ".warning",".weak",".weakref",".word",
".zero",".2byte",".4byte",".8byte"
};
ASMSyntaxer::ASMSyntaxer()
ASMSyntaxer::ASMSyntaxer(bool isATT):
mATT(isATT)
{
mNumberAttribute = std::make_shared<TokenAttribute>(SYNS_AttrNumber, TokenType::Number);
addAttribute(mNumberAttribute);
@ -125,6 +249,16 @@ const PTokenAttribute &ASMSyntaxer::registerAttribute() const
return mRegisterAttribute;
}
bool ASMSyntaxer::isATT() const
{
return mATT;
}
void ASMSyntaxer::setATT(bool newATT)
{
mATT = newATT;
}
void ASMSyntaxer::CommentProc()
{
mTokenID = TokenId::Comment;
@ -311,6 +445,8 @@ QString ASMSyntaxer::languageName()
ProgrammingLanguage ASMSyntaxer::language()
{
if (isATT())
return ProgrammingLanguage::ATTAssembly;
return ProgrammingLanguage::Assembly;
}
@ -470,8 +606,13 @@ void ASMSyntaxer::resetState()
QSet<QString> ASMSyntaxer::keywords() const
{
QSet<QString> result=Instructions;
if (!isATT()) {
result.unite(Directives);
result.unite(Registers);
} else {
result.unite(ATTDirectives);
result.unite(ATTRegisters);
}
return result;
}

View File

@ -44,7 +44,7 @@ class ASMSyntaxer : public Syntaxer
};
public:
explicit ASMSyntaxer();
explicit ASMSyntaxer(bool isATT=false);
ASMSyntaxer(const ASMSyntaxer&)=delete;
ASMSyntaxer& operator=(const ASMSyntaxer&)=delete;
@ -55,7 +55,9 @@ public:
static const QSet<QString> Instructions;
static const QSet<QString> Registers;
static const QSet<QString> ATTRegisters;
static const QSet<QString> Directives;
static const QSet<QString> ATTDirectives;
private:
QChar* mLine;
QString mLineString;
@ -70,6 +72,7 @@ private:
PTokenAttribute mDirectiveAttribute;
PTokenAttribute mRegisterAttribute;
PTokenAttribute mLabelAttribute;
bool mATT;
private:
void CommentProc();
@ -113,6 +116,8 @@ public:
public:
QSet<QString> keywords() const override;
bool isATT() const;
void setATT(bool newATT);
};
}

View File

@ -95,6 +95,7 @@ enum class ProgrammingLanguage {
DecideBySuffix,
Composition,
Assembly,
ATTAssembly,
CPP,
GLSL,
Makefile,