mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Merge pull request #2383 from larsbrinkhoff/troff
More file extensions for Groff
This commit is contained in:
		| @@ -295,9 +295,25 @@ module Linguist | ||||
|         Language["Common Lisp"] | ||||
|       elsif /^(%[%{}]xs|<.*>)/.match(data) | ||||
|         Language["Lex"] | ||||
|       elsif /^\.[a-z][a-z](\s|$)/.match(data) | ||||
|       elsif /^\.[a-z][a-z](\s|$)/i.match(data) | ||||
|         Language["Groff"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate "Groff", "Nemerle" do |data| | ||||
|       if /^[.']/.match(data) | ||||
|         Language["Groff"] | ||||
|       elsif /^(module|namespace|using)\s/.match(data) | ||||
|         Language["Nemerle"] | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     disambiguate "GAS", "Groff" do |data| | ||||
|       if /^[.'][a-z][a-z](\s|$)/i.match(data) | ||||
|         Language["Groff"] | ||||
|       elsif /((^|\s)move?[. ])|\.(include|globa?l)\s/.match(data) | ||||
|         Language["GAS"] | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -1041,6 +1041,7 @@ GAS: | ||||
|   group: Assembly | ||||
|   extensions: | ||||
|   - .s | ||||
|   - .ms | ||||
|   tm_scope: source.asm.x86 | ||||
|   ace_mode: assembly_x86 | ||||
|  | ||||
| @@ -1209,13 +1210,26 @@ Groff: | ||||
|   extensions: | ||||
|   - .man | ||||
|   - '.1' | ||||
|   - .1in | ||||
|   - .1m | ||||
|   - .1x | ||||
|   - '.2' | ||||
|   - '.3' | ||||
|   - .3in | ||||
|   - .3m | ||||
|   - .3qt | ||||
|   - .3x | ||||
|   - '.4' | ||||
|   - '.5' | ||||
|   - '.6' | ||||
|   - '.7' | ||||
|   - '.8' | ||||
|   - '.9' | ||||
|   - .l | ||||
|   - .ms | ||||
|   - .n | ||||
|   - .rno | ||||
|   - .roff | ||||
|   tm_scope: text.groff | ||||
|   aliases: | ||||
|   - nroff | ||||
|   | ||||
							
								
								
									
										91
									
								
								samples/GAS/hello.ms
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								samples/GAS/hello.ms
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | ||||
| # output(): Hello, world.\n | ||||
| # mach(): all | ||||
|  | ||||
| # Emit hello world while switching back and forth between arm/thumb. | ||||
| # ??? Unfinished | ||||
|  | ||||
| 	.macro invalid | ||||
| # This is "undefined" but it's not properly decoded yet. | ||||
| 	.word 0x07ffffff | ||||
| # This is stc which isn't recognized yet. | ||||
| 	stc 0,cr0,[r0] | ||||
| 	.endm | ||||
|  | ||||
| 	.global _start | ||||
| _start: | ||||
| # Run some simple insns to confirm the engine is at least working. | ||||
| 	nop | ||||
|  | ||||
| # Skip over output text. | ||||
|  | ||||
| 	bl skip_output | ||||
|  | ||||
| hello_text: | ||||
| 	.asciz "Hello, world.\n" | ||||
|  | ||||
| 	.p2align 2 | ||||
| skip_output: | ||||
|  | ||||
| # Prime loop. | ||||
|  | ||||
| 	mov r4, r14 | ||||
|  | ||||
| output_next: | ||||
|  | ||||
| # Switch arm->thumb to output next chacter. | ||||
| # At this point r4 must point to the next character to output. | ||||
|  | ||||
| 	adr r0, into_thumb + 1 | ||||
| 	bx r0 | ||||
|  | ||||
| into_thumb: | ||||
| 	.thumb | ||||
|  | ||||
| # Output a character. | ||||
|  | ||||
| 	mov r0,#3 @ writec angel call | ||||
| 	mov r1,r4 | ||||
| 	swi 0xab @ ??? Confirm number. | ||||
|  | ||||
| # Switch thumb->arm. | ||||
|  | ||||
| 	adr r5, back_to_arm | ||||
| 	bx r5 | ||||
|  | ||||
| 	.p2align 2 | ||||
| back_to_arm: | ||||
| 	.arm | ||||
|  | ||||
| # Load next character, see if done. | ||||
|  | ||||
| 	add r4,r4,#1 | ||||
| 	sub r3,r3,r3 | ||||
| 	ldrb r5,[r4,r3] | ||||
| 	teq r5,#0 | ||||
| 	beq done | ||||
|  | ||||
| # Output a character (in arm mode). | ||||
|  | ||||
| 	mov r0,#3 | ||||
| 	mov r1,r4 | ||||
| 	swi #0x123456 | ||||
|  | ||||
| # Load next character, see if done. | ||||
|  | ||||
| 	add r4,r4,#1 | ||||
| 	sub r3,r3,r3 | ||||
| 	ldrb r5,[r4,r3] | ||||
| 	teq r5,#0 | ||||
| 	bne output_next | ||||
|  | ||||
| done: | ||||
| 	mov r0,#0x18 | ||||
| 	ldr r1,exit_code | ||||
| 	swi #0x123456 | ||||
|  | ||||
| # If that fails, try to die with an invalid insn. | ||||
|  | ||||
| 	invalid | ||||
|  | ||||
| exit_code: | ||||
| 	.word 0x20026 | ||||
							
								
								
									
										275
									
								
								samples/Groff/Tcl.n
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										275
									
								
								samples/Groff/Tcl.n
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,275 @@ | ||||
| '\" | ||||
| '\" Copyright (c) 1993 The Regents of the University of California. | ||||
| '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. | ||||
| '\" | ||||
| '\" See the file "license.terms" for information on usage and redistribution | ||||
| '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. | ||||
| '\" | ||||
| .TH Tcl n "8.6" Tcl "Tcl Built-In Commands" | ||||
| .so man.macros | ||||
| .BS | ||||
| .SH NAME | ||||
| Tcl \- Tool Command Language | ||||
| .SH SYNOPSIS | ||||
| Summary of Tcl language syntax. | ||||
| .BE | ||||
| .SH DESCRIPTION | ||||
| .PP | ||||
| The following rules define the syntax and semantics of the Tcl language: | ||||
| .IP "[1] \fBCommands.\fR" | ||||
| A Tcl script is a string containing one or more commands. | ||||
| Semi-colons and newlines are command separators unless quoted as | ||||
| described below. | ||||
| Close brackets are command terminators during command substitution | ||||
| (see below) unless quoted. | ||||
| .IP "[2] \fBEvaluation.\fR" | ||||
| A command is evaluated in two steps. | ||||
| First, the Tcl interpreter breaks the command into \fIwords\fR | ||||
| and performs substitutions as described below. | ||||
| These substitutions are performed in the same way for all | ||||
| commands. | ||||
| Secondly, the first word is used to locate a command procedure to | ||||
| carry out the command, then all of the words of the command are | ||||
| passed to the command procedure. | ||||
| The command procedure is free to interpret each of its words | ||||
| in any way it likes, such as an integer, variable name, list, | ||||
| or Tcl script. | ||||
| Different commands interpret their words differently. | ||||
| .IP "[3] \fBWords.\fR" | ||||
| Words of a command are separated by white space (except for | ||||
| newlines, which are command separators). | ||||
| .IP "[4] \fBDouble quotes.\fR" | ||||
| If the first character of a word is double-quote | ||||
| .PQ \N'34' | ||||
| then the word is terminated by the next double-quote character. | ||||
| If semi-colons, close brackets, or white space characters | ||||
| (including newlines) appear between the quotes then they are treated | ||||
| as ordinary characters and included in the word. | ||||
| Command substitution, variable substitution, and backslash substitution | ||||
| are performed on the characters between the quotes as described below. | ||||
| The double-quotes are not retained as part of the word. | ||||
| .IP "[5] \fBArgument expansion.\fR" | ||||
| If a word starts with the string | ||||
| .QW {*} | ||||
| followed by a non-whitespace character, then the leading | ||||
| .QW {*} | ||||
| is removed and the rest of the word is parsed and substituted as any other | ||||
| word. After substitution, the word is parsed as a list (without command or | ||||
| variable substitutions; backslash substitutions are performed as is normal for | ||||
| a list and individual internal words may be surrounded by either braces or | ||||
| double-quote characters), and its words are added to the command being | ||||
| substituted. For instance, | ||||
| .QW "cmd a {*}{b [c]} d {*}{$e f {g h}}" | ||||
| is equivalent to | ||||
| .QW "cmd a b {[c]} d {$e} f {g h}" . | ||||
| .IP "[6] \fBBraces.\fR" | ||||
| If the first character of a word is an open brace | ||||
| .PQ { | ||||
| and rule [5] does not apply, then | ||||
| the word is terminated by the matching close brace | ||||
| .PQ } "" . | ||||
| Braces nest within the word: for each additional open | ||||
| brace there must be an additional close brace (however, | ||||
| if an open brace or close brace within the word is | ||||
| quoted with a backslash then it is not counted in locating the | ||||
| matching close brace). | ||||
| No substitutions are performed on the characters between the | ||||
| braces except for backslash-newline substitutions described | ||||
| below, nor do semi-colons, newlines, close brackets, | ||||
| or white space receive any special interpretation. | ||||
| The word will consist of exactly the characters between the | ||||
| outer braces, not including the braces themselves. | ||||
| .IP "[7] \fBCommand substitution.\fR" | ||||
| If a word contains an open bracket | ||||
| .PQ [ | ||||
| then Tcl performs \fIcommand substitution\fR. | ||||
| To do this it invokes the Tcl interpreter recursively to process | ||||
| the characters following the open bracket as a Tcl script. | ||||
| The script may contain any number of commands and must be terminated | ||||
| by a close bracket | ||||
| .PQ ] "" . | ||||
| The result of the script (i.e. the result of its last command) is | ||||
| substituted into the word in place of the brackets and all of the | ||||
| characters between them. | ||||
| There may be any number of command substitutions in a single word. | ||||
| Command substitution is not performed on words enclosed in braces. | ||||
| .IP "[8] \fBVariable substitution.\fR" | ||||
| If a word contains a dollar-sign | ||||
| .PQ $ | ||||
| followed by one of the forms | ||||
| described below, then Tcl performs \fIvariable | ||||
| substitution\fR:  the dollar-sign and the following characters are | ||||
| replaced in the word by the value of a variable. | ||||
| Variable substitution may take any of the following forms: | ||||
| .RS | ||||
| .TP 15 | ||||
| \fB$\fIname\fR | ||||
| . | ||||
| \fIName\fR is the name of a scalar variable;  the name is a sequence | ||||
| of one or more characters that are a letter, digit, underscore, | ||||
| or namespace separators (two or more colons). | ||||
| Letters and digits are \fIonly\fR the standard ASCII ones (\fB0\fR\(en\fB9\fR, | ||||
| \fBA\fR\(en\fBZ\fR and \fBa\fR\(en\fBz\fR). | ||||
| .TP 15 | ||||
| \fB$\fIname\fB(\fIindex\fB)\fR | ||||
| . | ||||
| \fIName\fR gives the name of an array variable and \fIindex\fR gives | ||||
| the name of an element within that array. | ||||
| \fIName\fR must contain only letters, digits, underscores, and | ||||
| namespace separators, and may be an empty string. | ||||
| Letters and digits are \fIonly\fR the standard ASCII ones (\fB0\fR\(en\fB9\fR, | ||||
| \fBA\fR\(en\fBZ\fR and \fBa\fR\(en\fBz\fR). | ||||
| Command substitutions, variable substitutions, and backslash | ||||
| substitutions are performed on the characters of \fIindex\fR. | ||||
| .TP 15 | ||||
| \fB${\fIname\fB}\fR | ||||
| . | ||||
| \fIName\fR is the name of a scalar variable or array element.  It may contain | ||||
| any characters whatsoever except for close braces.  It indicates an array | ||||
| element if \fIname\fR is in the form | ||||
| .QW \fIarrayName\fB(\fIindex\fB)\fR | ||||
| where \fIarrayName\fR does not contain any open parenthesis characters, | ||||
| .QW \fB(\fR , | ||||
| or close brace characters, | ||||
| .QW \fB}\fR , | ||||
| and \fIindex\fR can be any sequence of characters except for close brace | ||||
| characters.  No further | ||||
| substitutions are performed during the parsing of \fIname\fR. | ||||
| .PP | ||||
| There may be any number of variable substitutions in a single word. | ||||
| Variable substitution is not performed on words enclosed in braces. | ||||
| .PP | ||||
| Note that variables may contain character sequences other than those listed | ||||
| above, but in that case other mechanisms must be used to access them (e.g., | ||||
| via the \fBset\fR command's single-argument form). | ||||
| .RE | ||||
| .IP "[9] \fBBackslash substitution.\fR" | ||||
| If a backslash | ||||
| .PQ \e | ||||
| appears within a word then \fIbackslash substitution\fR occurs. | ||||
| In all cases but those described below the backslash is dropped and | ||||
| the following character is treated as an ordinary | ||||
| character and included in the word. | ||||
| This allows characters such as double quotes, close brackets, | ||||
| and dollar signs to be included in words without triggering | ||||
| special processing. | ||||
| The following table lists the backslash sequences that are | ||||
| handled specially, along with the value that replaces each sequence. | ||||
| .RS | ||||
| .TP 7 | ||||
| \e\fBa\fR | ||||
| Audible alert (bell) (Unicode U+000007). | ||||
| .TP 7 | ||||
| \e\fBb\fR | ||||
| Backspace (Unicode U+000008). | ||||
| .TP 7 | ||||
| \e\fBf\fR | ||||
| Form feed (Unicode U+00000C). | ||||
| .TP 7 | ||||
| \e\fBn\fR | ||||
| Newline (Unicode U+00000A). | ||||
| .TP 7 | ||||
| \e\fBr\fR | ||||
| Carriage-return (Unicode U+00000D). | ||||
| .TP 7 | ||||
| \e\fBt\fR | ||||
| Tab (Unicode U+000009). | ||||
| .TP 7 | ||||
| \e\fBv\fR | ||||
| Vertical tab (Unicode U+00000B). | ||||
| .TP 7 | ||||
| \e\fB<newline>\fIwhiteSpace\fR | ||||
| . | ||||
| A single space character replaces the backslash, newline, and all spaces | ||||
| and tabs after the newline.  This backslash sequence is unique in that it | ||||
| is replaced in a separate pre-pass before the command is actually parsed. | ||||
| This means that it will be replaced even when it occurs between braces, | ||||
| and the resulting space will be treated as a word separator if it is not | ||||
| in braces or quotes. | ||||
| .TP 7 | ||||
| \e\e | ||||
| Backslash | ||||
| .PQ \e "" . | ||||
| .TP 7 | ||||
| \e\fIooo\fR  | ||||
| . | ||||
| The digits \fIooo\fR (one, two, or three of them) give a eight-bit octal  | ||||
| value for the Unicode character that will be inserted, in the range | ||||
| \fI000\fR\(en\fI377\fR (i.e., the range U+000000\(enU+0000FF). | ||||
| The parser will stop just before this range overflows, or when | ||||
| the maximum of three digits is reached.  The upper bits of the Unicode | ||||
| character will be 0. | ||||
| .TP 7 | ||||
| \e\fBx\fIhh\fR  | ||||
| . | ||||
| The hexadecimal digits \fIhh\fR (one or two of them) give an eight-bit | ||||
| hexadecimal value for the Unicode character that will be inserted.  The upper | ||||
| bits of the Unicode character will be 0 (i.e., the character will be in the | ||||
| range U+000000\(enU+0000FF). | ||||
| .TP 7 | ||||
| \e\fBu\fIhhhh\fR  | ||||
| . | ||||
| The hexadecimal digits \fIhhhh\fR (one, two, three, or four of them) give a | ||||
| sixteen-bit hexadecimal value for the Unicode character that will be | ||||
| inserted.  The upper bits of the Unicode character will be 0 (i.e., the | ||||
| character will be in the range U+000000\(enU+00FFFF). | ||||
| .TP 7 | ||||
| \e\fBU\fIhhhhhhhh\fR  | ||||
| . | ||||
| The hexadecimal digits \fIhhhhhhhh\fR (one up to eight of them) give a | ||||
| twenty-one-bit hexadecimal value for the Unicode character that will be | ||||
| inserted, in the range U+000000\(enU+10FFFF.  The parser will stop just | ||||
| before this range overflows, or when the maximum of eight digits | ||||
| is reached.  The upper bits of the Unicode character will be 0. | ||||
| .RS | ||||
| .PP | ||||
| The range U+010000\(enU+10FFFD is reserved for the future. | ||||
| .RE | ||||
| .PP | ||||
| Backslash substitution is not performed on words enclosed in braces, | ||||
| except for backslash-newline as described above. | ||||
| .RE | ||||
| .IP "[10] \fBComments.\fR" | ||||
| If a hash character | ||||
| .PQ # | ||||
| appears at a point where Tcl is | ||||
| expecting the first character of the first word of a command, | ||||
| then the hash character and the characters that follow it, up | ||||
| through the next newline, are treated as a comment and ignored. | ||||
| The comment character only has significance when it appears | ||||
| at the beginning of a command. | ||||
| .IP "[11] \fBOrder of substitution.\fR" | ||||
| Each character is processed exactly once by the Tcl interpreter | ||||
| as part of creating the words of a command. | ||||
| For example, if variable substitution occurs then no further | ||||
| substitutions are performed on the value of the variable;  the | ||||
| value is inserted into the word verbatim. | ||||
| If command substitution occurs then the nested command is | ||||
| processed entirely by the recursive call to the Tcl interpreter; | ||||
| no substitutions are performed before making the recursive | ||||
| call and no additional substitutions are performed on the result | ||||
| of the nested script. | ||||
| .RS | ||||
| .PP | ||||
| Substitutions take place from left to right, and each substitution is | ||||
| evaluated completely before attempting to evaluate the next.  Thus, a | ||||
| sequence like | ||||
| .PP | ||||
| .CS | ||||
| set y [set x 0][incr x][incr x] | ||||
| .CE | ||||
| .PP | ||||
| will always set the variable \fIy\fR to the value, \fI012\fR. | ||||
| .RE | ||||
| .IP "[12] \fBSubstitution and word boundaries.\fR" | ||||
| Substitutions do not affect the word boundaries of a command, | ||||
| except for argument expansion as specified in rule [5]. | ||||
| For example, during variable substitution the entire value of | ||||
| the variable becomes part of a single word, even if the variable's | ||||
| value contains spaces. | ||||
| .SH KEYWORDS | ||||
| backslash, command, comment, script, substitution, variable | ||||
| '\" Local Variables: | ||||
| '\" mode: nroff | ||||
| '\" fill-column: 78 | ||||
| '\" End: | ||||
							
								
								
									
										1174
									
								
								samples/Groff/fsinterface.ms
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1174
									
								
								samples/Groff/fsinterface.ms
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user