我使用ANTLR4
來解析一些「簡化」的C風格源代碼。我的語法如下:匹配到函數結束
grammar Language;
script: (include)* (functionDefinition)* EOF;
include: '#include' Blank FilePath Semicolon;
functionName: FileName;
functionDefinition: functionName '(' parameters ')' '{' functionBody '}';
functionBody: .*?; // This needs fixing
parameter: FileName;
parameters: parameter (',' Blank parameter)*;
FileName: AlphaCharacter WordCharacter*;
FilePath: FileName ChildFilePath*;
ChildFilePath: PathSlash FileName;
PathSlash: ForwardSlash | BackwardSlash;
ForwardSlash: '/';
BackwardSlash: '\\';
AlphaCharacter: [a-zA-Z];
WordCharacter: [a-zA-Z_0-9];
Blank: ' ';
Whitespace: (' ' | '\t' | '\r' | '\n');
Semicolon: ';';
SkipWhitespaces: Whitespace+ -> skip;
鑑於以下輸入文本:
#include testWz/fdrf675tr\a56s;
#include testWz/fdrftr\s;
func1(param, par)
{
if(true)
{
whatever();
}
}
func2()
{
}
我實現下面的訪問,看看發生了什麼事情:
public class ListenerPrinter extends LanguageBaseListener
{
@Override
public void enterInclude(LanguageParser.IncludeContext context)
{
System.out.println("[INCLUDE] " + context.FilePath().getText());
}
@Override
public void enterFunctionDefinition(LanguageParser.FunctionDefinitionContext definition)
{
LanguageParser.ParametersContext parameters = definition.parameters();
System.out.println("[FUNCTION DEFINITION] " + definition.getText());
System.out.println("[PARAMETERS] " + parameters.getText());
System.out.println("[BODY] " + definition.functionBody().getText());
}
}
我想正確檢測函數體沒有將它們分解成它們的組件,因爲這當然是更多的工作。到目前爲止,將生成以下輸出:
[INCLUDE] testWz/fdrf675tr\a56s
[INCLUDE] testWz/fdrftr\s
[FUNCTION DEFINITION] func1(param, par){if(true){whatever();}}func2(){}
[PARAMETERS] param, par
[BODY] if(true){whatever();}}func2(){
函數體太長,並且還包括下一個函數的定義。一個想法是檢測下一個右括號+在兩者之間找到的已打開括號的數量,但我不確定如何單獨使用語法規則來做到這一點。
您的「簡化」C是否允許函數包含嵌套的{...}?您意味着用*檢測...在兩者之間找到的已打開括號的數量。如果是這樣,一個簡單的正則表達式不能拿起函數體,因爲正則表達式不能匹配任意的括號。如果不是,你簡化的C是不現實的,你不清楚你將通過一個不切實際的語言做這個練習會學到什麼,你可以在別的地方使用它。 –
@IraBaxter:它不是一種不現實的語言,因爲它作爲腳本引擎存在。我也不確定你的意思是嵌套{...},因爲存在常規的'if'和'while'循環,但是沒有「嵌套在另一個函數中的函數」,這是非常不尋常的 – BullyWiiPlaza
你允許嵌套{ ...}?例如,如果c {... if d {} ...}?這很常見。一種不允許他們的語言是非常罕見的。 –