herbrich19
Goto Top

Script Parser für C ähnlichen Code Programmieren

Hallo,

Hat jemand eine Grundlegende Idee wie ich C ähnlichen Code parsen kann. Ich arbeite mit Visual Basic aber habe mit C# sample Code auch keine Probleme. Ich erwarte keinen Fertigen Code sondern er par Denkanstöße um selbst die richtige Idee zu bekommen.

Gruß an die IT-Welt,
J Herbrich

Content-Key: 344660

Url: https://administrator.de/contentid/344660

Printed on: July 21, 2024 at 14:07 o'clock

Member: MttKrb
MttKrb Jul 27, 2017 at 12:24:17 (UTC)
Goto Top
Hi,
ein paar Denkanstöße findest du hier: https://www.staff.uni-giessen.de/~gc1079/compiler/compiler.pdf
Ist jetzt natürlich mehr, als du direkt benötigst, ist auch nur ein Denkanstoß. face-wink
Member: atze187
atze187 Jul 28, 2017 at 05:31:42 (UTC)
Goto Top
Moinsen,

für C# gibt da schon was fertiges: CS-Script

Gruß,
Atze
Member: atze187
atze187 Aug 07, 2017 at 08:27:26 (UTC)
Goto Top
Ahso, dann gibt es natürlich noch Antlr3

Wenn ich mich nicht irre dann ist in der aktuellen dotnetpro auch ein guter Artikel dazu drin (diese Information ist allerdings ohne Gewähr).
Member: Herbrich19
Herbrich19 Aug 07, 2017 at 21:54:27 (UTC)
Goto Top
Hallo,

Wenn ich mich nicht irre dann ist in der aktuellen dotnetpro auch ein guter Artikel dazu drin (diese Information ist allerdings ohne Gewähr).

Ja, habe versucht diese Zeitschrift zu finden aber in Kiosk war die nicht zu habebn -.- Ich werde mir Antlr auf jeden Fall mal anschauen. Wichtig ist ja das es kein C wird sondern eine eigene Programmiersprache / 'Scriptsprache die speziell für meine Software Herbrich-23 gedacht ist.

Der Grund warum ich mich überhaupt mit sowas beschäftige ist auch eigentlich ganz simpel. Die Software ist super und sie kann vieles aber nicht alles ist über eine GUI eingabe realisierbar. Deswegen gibt's ne Menge Code der aber einfach nicht benutzt oder zumindest nicht voll ausgereizt wird. Und genau dass möchte ich jetzt mit einer eigenen Script Sprache ändern.

Gruß an die IT-Welt,
J Herbrich
Member: runasservice
runasservice Aug 09, 2017 updated at 09:13:03 (UTC)
Goto Top
Zitat von @Herbrich19:

...Und genau dass möchte ich jetzt mit einer eigenen Script Sprache ändern.


Wenn Du dir die Arbeitszeit sparen möchtest, kannst Du dir bei mir einen fertigen "Basic-Interpreter" kaufen. Der Interpreter wird als DLL-Datei geliefert und wird sehr einfach mit nur 3 Funktionen in die die eignende Anwendung integriert Hier ein einfaches Code-Beispiel für eine eigende Replace-String (der Aufruf enspricht dem Syntax von VB6 , wie viele Elemente des Interpreters) Funktion:

Function Replace(str, findSubstr, replacement, beginIndex=0, maxCount=-1)
	findSubstrLen = Len(findSubstr)
	replacementLen = Len(replacement)
	count = 0
	While count <> maxCount Do
		nextSubstrIndex = Find(str, findSubstr, beginIndex)
		If nextSubstrIndex = -1 Then
			Break
		End
		str = Mid(str, 0, nextSubstrIndex) _
		    & replacement _
		    & Mid(str, nextSubstrIndex + findSubstrLen)
		count += 1
		beginIndex = nextSubstrIndex + replacementLen _
		           + IIf(findSubstrLen = 0, 1, 0)
	End
	Return str
End
'  
'Benötigte Funktionen  
'  

Function StartsWith(str, start)
	Return Mid(str, 0, Len(start)) = start
End

Function EndsWith(str, ending)
	If Len(ending) > Len(str) Then
		Return False
	End
	Return Mid(str, Len(str) - Len(ending), Len(ending)) = ending
End

Function Find(str, substr, beginIndex=0)
	strLen = Len(str)
	substrLen = Len(substr)
	For i = beginIndex To strLen - substrLen Do
		If Mid(str, i, substrLen) = substr Then
			Return i
		End
	End
	Return -1
End

Hier noch ein Beispiel für die matematischen Möglichkeiten:

Const PI = 3.14159265358979

Function Abs(n)
	Return IIf(n >= 0, n, -n)
End

Function Sqrt(n)
	If n < 0 Then
		Return Empty()
	ElseIf n = 0 Then
		Return n
	End
	
	sqrtOfN = 1.0	
	While Abs(n/sqrtOfN - sqrtOfN) > 0.0001 Do
		sqrtOfN = (sqrtOfN + n/sqrtOfN) / 2
	End
	Return sqrtOfN
End

Function DegToRad(n)
	Return n * PI / 180
End

Function RadToDeg(n)
	Return n * 180 / PI
End

Function Min(a, b)
	Return IIf(a < b, a, b)
End

Function Max(a, b)
	Return IIf(a > b, a, b)
End

Function ArrayMin(arr)
	minElement = Empty()
	ForEach element In arr Do
		If element < minElement Then
			minElement = element
		End
	End
	Return minElement
End

Function ArrayMax(arr)
	maxElement = Empty()
	ForEach element In arr Do
		If element > maxElement Then
			maxElement = element
		End
	End
	Return maxElement
End

Hier ein Beispiel für die Array Funktionen:

' a = ["a", "b", "c", "d", "e"]  

Function IsArray(a)
	Return VarType(a) = 8204
End

Function ToString(a)
	If Not IsArray(a) Then
		Return "" & a  
	Else
		r = "(" & Len(a) & ")["  
		needsComma = False
		ForEach aa In a Do
			r &= (IIf(needsComma, ", ", "") & ToString(aa))  
			needsComma = True
		End
		Return r & "]"  
	End
End

Function ArraysEqual(a, b)
	If Len(a) <> Len(b) Then
		Return False
	End
	
	For i = 0 To Len(a) - 1
		lhsIsArray = IsArray(a[i])
		rhsIsArray = IsArray(b[i])
		
		If lhsIsArray <> rhsIsArray Then
			Return False
		ElseIf lhsIsArray And rhsIsArray Then
			If Not ArraysEqual(a[i], b[i]) Then
				Return False
			End
		ElseIf a[i] <> b[i] Then
			Return False
		End
	End
	
	Return True
End

Function ReverseArray(a)
	aLen = Len(a)
	If aLen <= 1 Then
		Return a
	End
	result = Array(aLen)
	For i = 0 To aLen - 1
		result[i] = a[aLen - 1 - i]
	End
	Return result
End

Function NextPermutation(a)
	last = Len(a)
	If last <= 1 Then
		Return [False, a]
	End
	i = last
	i -= 1
	
	While True Do
		ii = i
		i -= 1

		If a[i] < a[ii] Then
			j = last
			While Not (a[i] < a[j -= 1]) Do
			End

			tmp = a[i]
			a[i] = a[j]
			a[j] = tmp
			
			a = Mid(a, 0, ii) & ReverseArray(Mid(a, ii, -1))
			Return [True, a]
		End
		If i = 0 Then
			Return [False, ReverseArray(a)]
		End
	End
End

Function AllPermutations(a)
	p = [True, a]
	c = 0
	While p Do
		p((c += 1) & ": " & ToString(p[1]))  
		p = NextPermutation(p[1])
	End
End

Function QuickSort(a)
	lo = 0
	hi = Len(a) - 1
	If hi <= lo Then
		Return a
	End
	
	pivot = a[hi]
	i = lo   
	For j = lo To hi - 1
		If a[j] <= pivot Then
			tmp = a[i]
			a[i] = a[j]
			a[j] = tmp
			i += 1
		End
	End
	tmp = a[i]
	a[i] = a[hi]
	a[hi] = tmp
	
	lpart =  QuickSort(Mid(a, 0, i)) & [pivot]
	       
	hpart = 
	If i < hi Then
		hpart = QuickSort(Mid(a, i + 1, -1))
	End
	
	Return lpart & hpart
End

Function SelectionSort(a)
	sortedBegin = Len(a)
	While sortedBegin > 0 Do
		highestIndex = 0
		For i = 0 To sortedBegin - 1 Do
			If a[i] >= a[highestIndex] Then
				highestIndex = i
			End
		End
		sortedBegin -= 1
		tmp = a[highestIndex]
		a[highestIndex] = a[sortedBegin]
		a[sortedBegin] = tmp
	End
	
	Return a
End

Den Interpreter kannst Du mit beliebiegen Funktionen deiner Anwendung erweitern. Die Entwickler-Lizenz geht los bei 2.000 €, bei interesse einfach eine PM an mich!

MFG
Member: Herbrich19
Herbrich19 Aug 09, 2017 at 19:52:38 (UTC)
Goto Top
Hallo,

Es geht um den Lerneffekt aber trotzdem Danke für das Angebot.

Gruß an die IT-Welt,
J Herbrich
Member: runasservice
runasservice Aug 10, 2017 updated at 06:56:41 (UTC)
Goto Top
Zitat von @Herbrich19:

Es geht um den Lerneffekt aber trotzdem Danke für das Angebot.


Es gibt zu diesem Thema zahlreiche Bücher. Einfach mal bei Amazon "Übersetzerbau" eingeben. Ein Informatik Studium wäre schon ein Vorteil um sich in dieses Thema schnell zu erschliesen.

MfG